首先,我必须说我是 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。我如何发送“结果”?
提前致谢..
最佳答案
不要打开一个新线程从这个线程运行异步任务。它不会工作(将在内部处理程序上失败)。异步任务自己为您打开一个新线程。
这是正确的代码:
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);
}
编辑:对于您的问题,如何从AsyncTask
访问TextView
您可以通过多种方式做到这一点。这些是其中的一部分:
将
AyncTask
定义为Activity
中的内部类。您可以在AsyncTask
中访问Activity
的成员。这个选项是非常耦合的,意味着异步任务显然你的应用程序的逻辑是你的用户界面的一部分。像这样: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); } } }
通过构造函数或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); } } }
以及您的 Activity :
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"); } }
为了使您的程序更加松散耦合并更好地将 Controller 与您的 View 分离,请使用
Handler
: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); } } }
以及您的 Activity :
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"); } }
处理程序提供大量选项。您可以从任何线程“发送消息”,并且可以使用此工具很好地解耦您的应用程序。
关于java - 如何将值从 onPostExecute() 发送到 Activity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22519541/