我如何从onPostExecute()发送值到Activity



首先我必须说我是Android新手,但不是Java新手。我做了HttpRequest With AsyncTask.

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

创建另一个类(Name: 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'
  }

我想发送和写这个字符串值的TextView在mainactivity。如何发送"结果"?

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

这是正确的代码:

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

Edit:对于您的问题,如何从AsyncTask访问TextView
你可以用很多方法来做。以下是其中的一部分:

  1. AyncTask定义为Activity的内部类。可以在AsyncTask中访问Activity的成员。这个选项是耦合的,意味着异步任务,显然你的应用程序的逻辑是你的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"); 
        } 
    }
    

    处理程序提供了大量的选项。你可以从任何线程发送消息,你可以很好地解耦你的应用程序与这个工具。

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

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

就这样了:)

编辑:

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

最佳解决方案

与其为不同类型的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);
   }
});

I在快速获得响应方面非常有效。

我希望这能帮到你。:)

相关内容

  • 没有找到相关文章

最新更新