2011-05-04 87 views
0

我正在写一个与网站进行通信的Android应用程序。任何时候我点击网站,我都会显示一个ProcessDialog,以便用户知道发生了什么。我的大部分网站沟通都是单向的,所以我通常不会期望任何回报数据。子线程的返回值

但是,有一点我需要获取信息,但是当我退出子线程时,结果不会被存储。简而言之,我需要调用一个线程,让它处理结果,并将结果存储在几个字段中。

这里就是我这么远 - 我有两个变量,String[] Accountboolean 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(); 
     } 
    }; 
} 

任何想法,我需要做的,能够存储账户和AccountRetrievalSuccess值,使我可以从代码中的其他地方访问它们?

回答

0

请勿使用线程。你应该为此使用执行者。实现一个Callable接口,创建一个ExecutorService并运行它。看看java.util.concurrent包。

0

让那些全局变量中包含Activity,然后将它们传递到处理程序:

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

然后在处理程序,你可以投m.obj回帐户类型和其漂亮的和可用的。

0

斯科特..你不应该有每个活动多个处理程序。而是打开什么。您可以发送数据(或对象)的消息,如:

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等。

2

看起来像一个完美的工作AsyncTask

该类允许您在后台线程上运行任务并将结果返回给UI线程,同时报告当前任务的进度。

由于移动网络连接的性质,如果您的服务器确实获得了您发送的内容(并且服务器可能在处理时失败并且您的应用永远不会知道......)