Java 如何将值从onPostExecute()发送到活动
首先,我必须说我是Android新手,但不是Java新手。 我用AsyncTask做了HttpRequestJava 如何将值从onPostExecute()发送到活动,java,android,android-asynctask,textview,httprequest,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() {
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扩展了AsyncTask{
私有void请求任务(字符串URL){
HttpClient HttpClient=新的DefaultHttpClient();
HttpResponse响应;
//这里有一些代码。。。
回报率;
}
@凌驾
受保护的字符串doInBackground(字符串…uri){
HttpClient HttpClient=新的DefaultHttpClient();
HttpResponse响应;
字符串responseString=null;
//这里有一些代码。。。
}
@凌驾
受保护的void onPostExecute(字符串结果){
super.onPostExecute(结果);
//我的结果是“结果”
}
我想将此字符串值发送并写入MainActivty中的TextView。如何发送“结果”?提前感谢。您可以将TextView传递给RequestTask的构造函数,也可以将其设置为全局成员。在onPostExecute方法中:
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
yourTextView.setText(result);
}
就这样:)
Edit:Whoops。正如sromku正确指出的那样,AsyncTask已经在一个单独的线程(后台)中执行
doInBackground()
方法因此,您不应该将其包装在另一个线程中。因此,请删除该线程异常。您可以将TextView传递给RequestTask的构造函数或使其成为全局成员。在onPostExecute方法中:
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
yourTextView.setText(result);
}
就这样:)
Edit:Whoops。正如sromku正确指出的,AsyncTask已经在一个单独的线程(在后台)中执行了
doInBackground()
方法,因此您不应该将其包装到另一个线程中。因此,请删除该线程异常。不要打开新线程从该线程运行异步任务。它不会工作(将在内部处理程序上失败)。异步任务本身将为您打开一个新线程
这是正确的代码:
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
您可以通过多种方式完成此任务。以下是其中的一部分:
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);
}
}
}
以及您的活动:
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");
}
}
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");
}
}
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);
}
}
}
你可以从任何线程“发送消息”,你可以用这个工具很好地解耦你的应用程序不要打开新线程以从此线程运行异步任务。它将不起作用(将在内部处理程序上失败)。异步任务本身将为您打开一个新线程 这是正确的代码:
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
您可以通过多种方式完成此任务。以下是其中的一部分:
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);
}
}
}
以及您的活动:
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");
}
}
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");
}
}
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);
}
}
}
你可以从任何线程“发送消息”,你可以用这个工具很好地解耦你的应用程序AsyncHttpClient client = new AsyncHttpClient();
client.get("http://www.google.com", new AsyncHttpResponseHandler() {
@Override
public void onSuccess(String response) {
System.out.println(response);
}
});
我能很快得到回复
我希望这能帮到你。:)最佳解决方案
我建议您使用这个库,而不是为不同类型的异步任务使用这么多的类
你可以看看这里
您的代码将变得非常非常少,您可以只使用4行代码,而不是声明可以分别编写大量代码
AsyncHttpClient client = new AsyncHttpClient();
client.get("http://www.google.com", new AsyncHttpResponseHandler() {
@Override
public void onSuccess(String response) {
System.out.println(response);
}
});
我能很快得到回复
我希望这能帮助您。:)将其移动到完成答案。但是我的+1:)将其移动到完成答案。但是我的+1:)我将TextView变量作为全局成员创建,但如果我在RequestTask类中定义MainActivity并使用somevalue.TextView.setText(结果)调用,它不会出现在RequestTask中;程序失败。由于存在RequestTask()方法,因此没有意义如何将TextView变量发送到RequestTask的构造函数。@user3077045查看我的应答我将TextView变量作为全局成员,但如果我在RequestTask类中定义MainActivity并使用somevalue.TextView.setText(结果)调用,则该变量不会出现在RequestTask中;程序失败。这没有意义,因为有一个方法是RequestTask()。如何将TextView的变量发送到RequestTask的构造函数中。@user3077045查看我的答案