我想为繁重的网络操作创建自定义通用线程类。
我知道如何使用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
将消失。