如何从onPostExecute()向Activity发送值

时间:2014-03-19 22:30:50

标签: java android android-asynctask textview httprequest

首先,我必须说我是Android新手而不是Java手机。 我用AsyncTask做了HttpRequest。

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Thread th = new Thread(new Runnable() {     
        @Override
        public void run() {             
            new RequestTask().execute("http://www.url.com/ajaxrequest/?kategori=27");
        }
    });             
        th.start(); 
}

创建另一个类(名称:RequesTask)

class RequestTask extends AsyncTask<String, String, String>{

private void RequestTask(String URL){

    HttpClient httpclient = new DefaultHttpClient();
    HttpResponse response;
    // Some Codes Here...

    return responseString;
}

@Override
protected String doInBackground(String... uri) {
    HttpClient httpclient = new DefaultHttpClient();
    HttpResponse response;
    String responseString = null;
    // Some Codes Here...

}

@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);
    // My Result is 'result'
  }

我想在MainActivty中将此字符串值发送并写入TextView。我如何发送&#39;结果&#39; ?
提前谢谢..

3 个答案:

答案 0 :(得分:4)

不要打开一个新线程来运行此线程的异步任务。它不会工作(将在内部处理程序上失败)。异步任务由他自己为你打开一个新线程。

这是正确的代码:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    textView = (TextView) findViewById(R.id.your_text_view);

    new RequestTask().execute("http://www.url.com/ajaxrequest/?kategori=27"); 
}

RequestTask

@Override
protected void onPostExecute(String result) {
    textView.setText(result);
}

修改:对于您的问题,如何从TextView访问AsyncTask 你可以通过很多方式做到这一点。这些是他们的一部分:

  1. AyncTask定义为Activity内的内部类。您可以在Activity内访问AsyncTask的成员。此选项非常耦合,意味着异步任务,显然您的应用程序的逻辑是您的UI的一部分。像这样:

    class YouActivity extends Activity { 
    
        TextView textView;
    
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            textView = (TextView) findViewById(R.id.your_text_view);
    
            new RequestTask().execute("http://www.url.com/ajaxrequest/?kategori=27"); 
        }
    
        class RequestTask extends AsyncTask<String, String, String> {
            ...
            @Override
            protected void onPostExecute(String result) {
                textView.setText(result);
            }
        } 
    
    }
    
  2. 通过构造函数或setter方法将TextView传递给AsyncTask。此选项的耦合程度较低,因为许多想要更新AsyncTask的消费者可以使用此TextView,但仍然可以通过将AsyncTask的引用保存到您的视图来进行耦合。 /> 您的AsyncTask

    class RequestTask extends AsyncTask<String, String, String> {
    
        TextView textView = null;
    
        public void setTextView(TextView textView) {
            this.textView = textView;
        }
    
        ...
    
        @Override
        protected void onPostExecute(String result) {
            if (textView != null) {
                textView.setText(result);
            }
        }
    }
    

    您的活动:

    class YouActivity extends Activity { 
    
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            TextView textView = (TextView) findViewById(R.id.your_text_view);
    
            RequestTask requestTask = new RequestTask();
            requestTask.setTextView(textView);
            requestTask.execute("http://www.url.com/ajaxrequest/?kategori=27"); 
        } 
    
    }
    
  3. 要使程序更加松散耦合并更好地将控制器与视图分离,请使用Handler s:

    class RequestTask extends AsyncTask<String, String, String> {
    
        Handler handler = null;
    
        public void setHandler(Handler handler) {
            this.handler = handler;
        }
    
        ...
    
        @Override
        protected void onPostExecute(String result) {
            if (handler != null) {
                Message message = new Message();
        message.obj = result;
                handler.sendMessage(message);
            }
        }
    }
    

    您的活动:

    class YouActivity extends Activity { 
    
        TextView textView;
    
        Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                 String value = (String) msg.obj;
                 textView.setText(value);
            }
        };
    
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            textView = (TextView) findViewById(R.id.your_text_view);
    
            RequestTask requestTask = new RequestTask();
            requestTask.setHandler(handler);
            requestTask.execute("http://www.url.com/ajaxrequest/?kategori=27"); 
        } 
    
    }
    

    处理程序解决了大量选择。您可以发送消息&#39;从任何线程,您可以使用此工具非常好地解耦您的应用程序。

答案 1 :(得分:1)

您可以将TextView传递给RequestTask的构造函数,也可以将其作为全局成员。在你的onPostExecute方法中:

@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);

    yourTextView.setText(result);

}

那就是:)

修改:哎呀。正如sromku正确指出的那样,AsyncTask已经在一个单独的线程中执行doInBackground()方法(在后台),所以你不应该将它包装在另一个线程中。所以,删除那个Thread-ception。

答案 2 :(得分:0)

最佳解决方案

我建议您使用此库

,而不是为不同类型的asynctask使用这么多类

你可以看看这里

http://loopj.com/android-async-http/

你的代码将变得非常少,而不是声明可能asynctask单独编写大量代码,你可以只使用4行代码

AsyncHttpClient client = new AsyncHttpClient();
client.get("http://www.google.com", new AsyncHttpResponseHandler() {
@Override
public void onSuccess(String response) {
    System.out.println(response);
   }
});

我非常有效地快速确定响应。

我希望这会帮助你。 :)