[英]Return value from child thread
我正在编写一个与网站通信的 Android 应用程序。 每当我访问该网站时,我都会显示一个 ProcessDialog,以便用户知道正在发生的事情。 我的大部分网站通信都是单向的,所以我通常不期望任何返回数据。
然而,有一点我需要取回信息,但是当我退出子线程时结果没有被存储。 简而言之,我需要调用一个线程,让它处理结果,并将结果存储在几个字段中。
这是我到目前为止所得到的 - 我有两个变量, String[] Account
和boolean AccountRetrievalSuccess
:
public void GetAccount() {
MyDialog = ProgressDialog.show( MyContext, "Retrieving Account" , "We're retrieving your account information. Please wait...", true);
Thread T = new GetAccountThread();
T.start();
}
public class GetAccountThread extends Thread {
@Override
public void run() {
try {
String resp = GetPage(BaseURL+MainPage+"?P="+PhoneID+"&K="+WebAccessKey+"&A=ACCOUNT");
if (resp.contains("FAILURE|")){
failhandler.sendEmptyMessage(0);
} else {
resp = resp.replace("SUCCESS|", "");
Account = resp.split("\\|");
handler.sendEmptyMessage(0);
}
} catch (Exception e) {
failhandler.sendEmptyMessage(0);
}
};
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
AccountRetrievalSuccess = true;
MyDialog.dismiss();
}
};
private Handler failhandler = new Handler() {
@Override
public void handleMessage(Message msg) {
AccountRetrievalSuccess = false;
MyDialog.dismiss();
ShowWtf();
}
};
}
知道我需要做什么才能存储 Account 和 AccountRetrievalSuccess 值,以便我可以从代码中的其他地方访问它们吗?
看起来是AsyncTask的完美工作!
此 class 允许您在后台线程上运行任务并将结果返回给 UI 线程,同时报告手头任务的进度。
顺便说一下,不期望在移动应用程序中得到结果可能是个坏主意,由于移动网络连接的性质,您永远无法确定您的服务器是否真的收到了您发送的内容(并且服务器可能在处理时出现故障你的应用程序永远不会知道......)
不要使用线程。 您应该为此使用执行程序。 实现一个 Callable<> 接口,创建一个 ExecutorService 并运行它。 看看 java.util.concurrent package。
在包含的Activity
中创建这些全局变量,然后将它们传递给处理程序:
Message m = Message.obtain();
m.obj = Account;
handler.sendMessageDelayed(m, 1);
然后在处理程序中,您可以将m.obj
回 Account 类型,并且它很好且可用。
Scott.. 每个活动不应有超过一个处理程序。 而是打开什么。 您可以在消息中发送数据(或对象),如下所示:
Message msg= Message.obtainMessage(0);
Bundle b= new Bundle();
b.putString("stringData",outString);
msg.setData(b);
handler.sendMessage(msg);
您可以在处理程序中打开多条消息,如。
public void handleMessage(Message msg){
switch(msg.what){
case BUTTON_ONE_UP_SELECTED:
this.removeMessages(BUTTON_ONE_UP_SELECTED);
buttonLarger01.setImageResource(R.drawable.btn_zoom_up_selected);
break;
case BUTTON_ONE_UP_NORMAL:
this.removeMessages(BUTTON_ONE_UP_NORMAL);
buttonLarger01.setImageResource(R.drawable.btn_zoom_up_normal);
break;
case BUTTON_TWO_UP_SELECTED:
this.removeMessages(BUTTON_TWO_UP_SELECTED);
buttonLarger02.setImageResource(R.drawable.btn_zoom_up_selected);
break;
case BUTTON_TWO_UP_NORMAL:
this.removeMessages(BUTTON_TWO_UP_NORMAL);
buttonLarger02.setImageResource(R.drawable.btn_zoom_up_normal);
break;
case BUTTON_ONE_DOWN_SELECTED:
this.removeMessages(BUTTON_ONE_DOWN_SELECTED);
buttonSmaller01.setImageResource(R.drawable.btn_zoom_down_selected);
break;
case BUTTON_ONE_DOWN_NORMAL:
this.removeMessages(BUTTON_ONE_DOWN_NORMAL);
buttonSmaller01.setImageResource(R.drawable.btn_zoom_down_normal);
break;
case BUTTON_TWO_DOWN_SELECTED:
this.removeMessages(BUTTON_TWO_DOWN_SELECTED);
buttonSmaller02.setImageResource(R.drawable.btn_zoom_down_selected);
break;
case BUTTON_TWO_DOWN_NORMAL:
this.removeMessages(BUTTON_TWO_DOWN_NORMAL);
buttonSmaller02.setImageResource(R.drawable.btn_zoom_down_normal);
break;
default:
super.handleMessage(msg);
break;
}
}
};
因此,在您的情况下,您可以将 SUCCESS 定义为 0 并将 FAILURE 定义为 1 等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.