首先我必须说我是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
你可以用很多方法来做。以下是其中的一部分:
将
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); } } }
通过构造函数或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"); } }
要使你的程序更松散耦合,并使控制器与视图更好地分离,使用
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在快速获得响应方面非常有效。
我希望这能帮到你。:)