我想为繁重的网络操作创建一个自定义通用线程类。
我知道如何使用 AsyncTask
,一直在使用它,但现在它有时会崩溃,因为不建议将 AsyncTask
用于需要超过 5 秒的操作......并且为了实现 OOP
原则(可重用性),我决定制作一个单独的通用 Thread 类,我的所有事务屏幕都可以使用它来发送和接收来自网络的数据!我不想为每个屏幕创建一个单独的线程..
我在互联网和 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
中获取值(value)??我看过很多关于 Message
的例子,但在我的场景中,我应该在 Activity 或 Thread
类中的什么地方实现 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
中声明一个回调接口(interface):
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
稳健。 .如果您的进程进入后台(用户按下主页按钮、接听电话等),Android 可以随时终止您的进程。在这种情况下,您的 NetworkThread
就会消失。
关于java - 如何在 Android 中设计自定义通用线程类(发送和接收数据),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27862480/