我有两个类。我的主要activity和扩展AsyncTask
的一个,现在在我的主要activity中,我需要从AsyncTask
中的OnPostExecute()
获得结果。我怎样才能通过或得到结果到我的主要activity?
下面是示例代码。
我的主要activity。
public class MainActivity extends Activity{
AasyncTask asyncTask = new AasyncTask();
@Override
public void onCreate(Bundle aBundle) {
super.onCreate(aBundle);
//Calling the AsyncTask class to start to execute.
asyncTask.execute(a.targetServer);
//Creating a TextView.
TextView displayUI = asyncTask.dataDisplay;
displayUI = new TextView(this);
this.setContentView(tTextView);
}
}
这是AsyncTask类
public class AasyncTask extends AsyncTask<String, Void, String> {
TextView dataDisplay; //store the data
String soapAction = "http://sample.com"; //SOAPAction header line.
String targetServer = "https://sampletargeturl.com"; //Target Server.
//SOAP Request.
String soapRequest = "<sample XML request>";
@Override
protected String doInBackground(String... string) {
String responseStorage = null; //storage of the response
try {
//Uses URL and HttpURLConnection for server connection.
URL targetURL = new URL(targetServer);
HttpURLConnection httpCon = (HttpURLConnection) targetURL.openConnection();
httpCon.setDoOutput(true);
httpCon.setDoInput(true);
httpCon.setUseCaches(false);
httpCon.setChunkedStreamingMode(0);
//properties of SOAPAction header
httpCon.addRequestProperty("SOAPAction", soapAction);
httpCon.addRequestProperty("Content-Type", "text/xml; charset=utf-8");
httpCon.addRequestProperty("Content-Length", "" + soapRequest.length());
httpCon.setRequestMethod(HttpPost.METHOD_NAME);
//sending request to the server.
OutputStream outputStream = httpCon.getOutputStream();
Writer writer = new OutputStreamWriter(outputStream);
writer.write(soapRequest);
writer.flush();
writer.close();
//getting the response from the server
InputStream inputStream = httpCon.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
ByteArrayBuffer byteArrayBuffer = new ByteArrayBuffer(50);
int intResponse = httpCon.getResponseCode();
while ((intResponse = bufferedReader.read()) != -1) {
byteArrayBuffer.append(intResponse);
}
responseStorage = new String(byteArrayBuffer.toByteArray());
} catch (Exception aException) {
responseStorage = aException.getMessage();
}
return responseStorage;
}
protected void onPostExecute(String result) {
aTextView.setText(result);
}
}
有几种选择:
>
在activity
类中嵌套AsyncTask
类。假设您不在多个活动中使用相同的任务,这是最简单的方法。您的所有代码保持不变,只需将现有的任务类移动为activity类中的嵌套类。
public class MyActivity extends Activity {
// existing Activity code
...
private class MyAsyncTask extends AsyncTask<String, Void, String> {
// existing AsyncTask code
...
}
}
为您的AsyncTask
创建一个自定义构造函数,它引用您的activity
。您可以使用类似new MyAsyncTask(this).execute(param1,param2)
的内容实例化任务。
public class MyAsyncTask extends AsyncTask<String, Void, String> {
private Activity activity;
public MyAsyncTask(Activity activity) {
this.activity = activity;
}
// existing AsyncTask code
...
}
容易:
>
创建接口
类,其中字符串输出
是可选的,也可以是任何要返回的变量。
public interface AsyncResponse {
void processFinish(String output);
}
转到AsyncTask
类,并将interfaceAsyncResponse
声明为字段:
public class MyAsyncTask extends AsyncTask<Void, Void, String> {
public AsyncResponse delegate = null;
@Override
protected void onPostExecute(String result) {
delegate.processFinish(result);
}
}
在您的主要activity中,您需要实现
接口异步响应
。
public class MainActivity implements AsyncResponse{
MyAsyncTask asyncTask =new MyAsyncTask();
@Override
public void onCreate(Bundle savedInstanceState) {
//this to set delegate/listener back to this class
asyncTask.delegate = this;
//execute the async task
asyncTask.execute();
}
//this override the implemented method from asyncTask
@Override
void processFinish(String output){
//Here you will receive the result fired from async class
//of onPostExecute(result) method.
}
}
更新
我不知道你们很多人都这么喜欢这个。下面是使用接口
的简单而方便的方法。
仍然使用相同的接口
。另外,您可以将其组合到AsyncTask
类中。
在AsyncTask
类中:
public class MyAsyncTask extends AsyncTask<Void, Void, String> {
// you may separate this or combined to caller class.
public interface AsyncResponse {
void processFinish(String output);
}
public AsyncResponse delegate = null;
public MyAsyncTask(AsyncResponse delegate){
this.delegate = delegate;
}
@Override
protected void onPostExecute(String result) {
delegate.processFinish(result);
}
}
在activity
类中执行此操作
public class MainActivity extends Activity {
MyAsyncTask asyncTask = new MyAsyncTask(new AsyncResponse(){
@Override
void processFinish(String output){
//Here you will receive the result fired from async class
//of onPostExecute(result) method.
}
}).execute();
}
或者,在activity上重新实现接口
public class MainActivity extends Activity
implements AsyncResponse{
@Override
public void onCreate(Bundle savedInstanceState) {
//execute the async task
new MyAsyncTask(this).execute();
}
//this override the implemented method from AsyncResponse
@Override
void processFinish(String output){
//Here you will receive the result fired from async class
//of onPostExecute(result) method.
}
}
正如您在上面看到的两个解决方案,第一个和第三个,它需要创建方法processFinish
,另一个,方法在caller参数内部。第三种更整洁,因为没有嵌套的匿名类。希望这有帮助
提示:将字符串输出
、字符串响应
和字符串结果
更改为不同的匹配类型,以获得不同的对象。
我从这个链接中阅读并应用了一些内容:如何将OnPostExecute()的结果获取到main activity,因为AsyncTask是一个单独的类?但是我在行委托上得到一个错误NullPointerException onPostExecute。ProcessFinish(result);我的代码有什么问题?代码如下:
问题内容: 我有这两节课。我的主要活动和扩展的一个,现在在我的主要活动,我需要从得到的结果中。如何将结果传递或获得主要活动? 这是示例代码。 我的主要活动。 这是AsyncTask类 问题答案: 简单: 创建interface类,其中是可选的,或者可以是您想要返回的任何变量。 转到您的AsyncTask课程,并将interface声明AsyncResponse为字段: 在您的主要活动中,需要进行i
我在获取AsyncTask类的onPostExecute()方法给出的值时遇到了一个问题,为什么它不显示给TextView? 但是,在中没有显示字符串响应,为什么会这样呢?对此有哪些可能的解决方案?
问题内容: 我正在尝试找出创建AsyncTask的正确方法,以从Internet检索一些数据,然后将这些数据打包并捆绑到Intent中,然后将其传递给新的活动(列表显示)。因此,在第一个活动中,我只有一个EditText和Button。在发生OnClick的情况下,应调用任务,并在完成任务后将数据捆绑到Intent中并传递给下一个Activity。问题是当我从onPostExecute获取结果并将
问题内容: 首先,抱歉英语不好。我有android 2.3,所以有“真实”并行AsyncTask而不是顺序执行(android 3.0及更高版本)。我有几个AsyncTasks,它们每个都执行onPostExecute()回调(我知道它将在UI线程中执行)。假设我只有两个并行的AsyncTask,并且当第一个任务完成其工作时,将调用回调onPostExecute()。是否有可能在UI线程上运行on
谁能帮帮我吗???