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

How to design a Custom Generic Thread class (send and recieve data) in Android

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

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

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

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();



     }

  }

}

我的一些Activity的按钮监听器

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 ??我在 Message 上看过很多例子,但在我的场景中,我应该在 Activity 或 Thread class 中实现 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中声明一个回调接口:

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 稳健。如果您的进程进入后台(用户按下 HOME 按钮,接听 phone 电话等),Android 可以随时终止您的进程。在这种情况下,您的 NetworkThread 就会消失。