我想为繁重的网络操作制作一个自定义通用线程类。
我知道如何使用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
?如果有其他方法,我愿意接受建议,谢谢。
答案 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
将会消失。