java - 如何在 Android 中设计自定义通用线程类(发送和接收数据)

标签 java android multithreading android-handler

我想为繁重的网络操作创建一个自定义通用线程类。

我知道如何使用 AsyncTask,一直在使用它,但现在它有时会崩溃,因为不建议将 AsyncTask 用于需要超过 5 秒的操作......并且为了实现 OOP 原则(可重用性),我决定制作一个单独的通用 Thread 类,我的所有事务屏幕都可以使用它来发送和接收来自网络的数据!我不想为每个屏幕创建一个单独的线程.. 我在互联网和 stackoverflow 上搜索了所有可能的解决方案...

这是我迄今为止尝试过的...

import mainMenu.AccountBean;
import parser.ParserMain;
import parser.ValuesBean;

public class NetworkThread implements Runnable {
private String proccessCode;
private AccountBean ab;
private ValuesBean vb;
private String[] sd;

public NetworkThread(String proccessCode, AccountBean ab, String[]sd){
    this.proccessCode = proccessCode;
    this.ab = ab;
    this.sd = sd;

}


@Override
public void run() {
    ParserMain pm = new ParserMain();
    try {
        // this method does socket based transactions..
        vb = pm.commenceTransaction(proccessCode, ab, sd); // I want this object 'vb' sent back to my activity..
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();



     }

  }

}

我的 SomeActivity 的按钮监听器

submit.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            NetworkThread nt = new NetworkThread("1234",ab, someOtherValuesHere);
            Handler h = new Handler();
            h.post(nt); //  <= how to get value from here
        }
    });

我的问题是如何从这个 Handler 中获取值(value)??我看过很多关于 Message 的例子,但在我的场景中,我应该在 Activity 或 Thread 类中的什么地方实现 Message ?如果有其他首选方法,我愿意接受建议,谢谢。

最佳答案

您没有在单独的 Thread 中运行它,尽管您已将其命名为 NetworkThread , 它不是 Thread这是在主 (UI) 线程上运行的,这不是您想要的。

更改 NetworkThread以便它扩展 Thread , 不是 Runnable .然后这样做:

    @Override
    public void onClick(View v) {
        NetworkThread nt = new NetworkThread("1234",ab, someOtherValuesHere);
        nt.start();
    }

NetworkThread获取数据回到调用 Activity,你可以这样做:

NetworkThread中声明一个回调接口(interface):

public Interface NetworkThreadCallback {
    void reportData(ValuesBean vb);
}

并在NetworkThread中声明一个成员变量:

private NetworkThreadCallback callback;

然后,在NetworkThread构造函数,添加一个参数NetworkThreadCallback callback并将其存储在成员变量 callback 中.在您成功调用 commenceTransaction 后,这样做:

callback.reportData(vb);

每次调用 Activity需要 implement NetworkThreadCallback并有一个方法

public void reportData(ValuesBean vb) {
    // Do something with the ValuesBean here...
}

您只需要了解此技术不如使用 Service 稳健。 .如果您的进程进入后台(用户按下主页按钮、接听电话等),Android 可以随时终止您的进程。在这种情况下,您的 NetworkThread就会消失。

关于java - 如何在 Android 中设计自定义通用线程类(发送和接收数据),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27862480/

相关文章:

java - 如何找出我的 JVM 支持什么算法 [加密]?

Java url-pattern 所有子域重定向

android - 工具栏的菜单项不可点击

android - ScrollView 不适用于 Fragment 中的 ConstraintLayout

java - 调用数据库时应用程序卡住

java - DriverManager.getConnection() 超时?

java - 如何使两个应用程序模块共享相同的实体缓存?

android - 使用按钮中 SharedPreferences 中的字符串开始新 Activity

java - 在 Java 中使用 new Thread(foo).start() 。寻找最佳实践

java - 如何证明 i++ 不是原子的