如何在 Android 中设计自定义通用线程 class(发送和接收数据)
How to design a Custom Generic Thread class (send and recieve data) in Android
我想为繁重的网络操作创建自定义通用线程Class。
我知道如何使用 AsyncTask
,一直在使用它,但现在它有时会崩溃,因为不建议将 AsyncTask
用于需要超过 5 秒的操作..以及实施 OOP
原则(可重用性)我决定制作一个单独的公共线程 class,我所有的交易屏幕都可以使用它来发送和接收来自网络的数据!我不想为每个屏幕创建一个单独的线程..
我在互联网和计算器中搜索了所有可能的解决方案...
这是我迄今为止尝试过的...
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();
}
}
}
我的一些Activity的按钮监听器
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 或 Thread
class 中实现 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
中声明一个回调接口:
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 按钮,接听 phone 电话等),Android 可以随时终止您的进程。在这种情况下,您的 NetworkThread
就会消失。
我想为繁重的网络操作创建自定义通用线程Class。
我知道如何使用 AsyncTask
,一直在使用它,但现在它有时会崩溃,因为不建议将 AsyncTask
用于需要超过 5 秒的操作..以及实施 OOP
原则(可重用性)我决定制作一个单独的公共线程 class,我所有的交易屏幕都可以使用它来发送和接收来自网络的数据!我不想为每个屏幕创建一个单独的线程..
我在互联网和计算器中搜索了所有可能的解决方案...
这是我迄今为止尝试过的...
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();
}
}
}
我的一些Activity的按钮监听器
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 或 Thread
class 中实现 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
中声明一个回调接口:
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 按钮,接听 phone 电话等),Android 可以随时终止您的进程。在这种情况下,您的 NetworkThread
就会消失。