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

时间:2015-01-09 14:13:56

标签: java android multithreading android-handler

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

我知道如何使用AsyncTask,一直在使用它,但现在它有时会崩溃,因为AsyncTask不建议用于超过5秒的操作。并且用于实现{{1} }原则(可重用性)我决定创建一个单独的公共Thread类,我的所有Transaction Screens都可以使用它来发送和接收来自网络的数据!我不想为每个屏幕制作单独的帖子.. 我搜索了互联网和stackoverflow以寻找所有可能的解决方案......

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

OOP

我的SomeActivity的按钮侦听器

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



     }

  }

}

我的问题是如何从这个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上看到了很多示例,但在我的场景中,我在Activity或Message类中实现了哪些Message?如果有其他方法,我愿意接受建议,谢谢。

1 个答案:

答案 0 :(得分:2)

您没有在单独的Thread中运行此功能,尽管您已将其命名为NetworkThread,但它不是Thread这是在主要运行的({1}} 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将会消失。