Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从子线程返回值_Java_Android - Fatal编程技术网

Java 从子线程返回值

Java 从子线程返回值,java,android,Java,Android,我正在编写一个Android应用程序,可以与网站进行通信。每当我访问网站时,我都会显示一个ProcessDialog,以便用户知道发生了什么。我的大多数网站交流都是单向的,所以我通常不希望收到任何返回数据 然而,有一点我需要返回信息,但是当我退出子线程时,结果不会被存储。简而言之,我需要调用一个线程,让它处理结果,并将结果存储在几个字段中 到目前为止,我得到了两个变量,String[]Account和boolean AccountRetrievalSuccess: public void Get

我正在编写一个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值,以便从代码中的其他地方访问它们吗?

不要使用线程。你应该使用遗嘱执行人。实现一个可调用接口,创建一个ExecutorService并运行它。查看java.util.concurrent包。

在containing
活动中生成这些全局变量,然后将它们传递给处理程序:

Message m = Message.obtain();
m.obj = Account;
handler.sendMessageDelayed(m, 1);

然后,在处理程序中,您可以将
m.obj
转换回帐户类型及其良好的可用性。

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;
        }
    }
};

因此,在您的情况下,您可以将成功定义为0,将失败定义为1等等。

对于您来说,这似乎是一份完美的工作

此类允许您在后台线程上运行任务,并将结果返回到UI线程,同时报告手头任务的进度

顺便说一句,不期望在移动应用程序中产生结果可能是个坏主意,因为移动网络连接的性质,你永远无法确定你的服务器是否真的收到了你发送的东西(服务器可能在处理过程中出现故障,而你的应用程序永远也不会知道……)