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

我知道如何使用AsyncTask,一直在使用它,但是现在它有时会崩溃,因为不建议将AsyncTask用于耗时超过5秒钟的操作。为了实现OOP原则(可重用性),我决定制作一个单独的通用线程类,我的所有事务屏幕都可以使用该类来发送和接收来自网络的数据!我不想为每个屏幕创建单独的线程。
我在互联网和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中获取价值?我在Message上看到了许多示例,但是在我的场景中,该在Activity或Message类中实现Thread的情况?如果有其他首选的方法,欢迎提出建议,谢谢。

最佳答案

尽管您已将其命名为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按钮,接听电话等),Android可以随时终止您的进程。在这种情况下,您的NetworkThread将消失。

09-06 18:48