首先,我必须说我是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; ?
提前谢谢..
答案 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
你可以通过很多方式做到这一点。这些是他们的一部分:
将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);
}
}
}
通过构造函数或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");
}
}
处理程序解决了大量选择。您可以发送消息&#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);
}
});
我非常有效地快速确定响应。
我希望这会帮助你。 :)