gpt4 book ai didi

android - Android中AsyncTask的通用类?

转载 作者:IT王子 更新时间:2023-10-29 00:04:39 26 4
gpt4 key购买 nike

我有一个通用类,例如 A 类,它扩展了 AsyncTask 并实现了所有方法,即 onPreExecutedoinbackgroundonPostExecute.

现在,还有其他类想要使用 A 类对象。

说B类以下面的方式使用A类

A a = new A(context)
a.execute(url)

然后我在 get 方法中获取结果。但是 get 方法不是使用 AsyncTask 的正确方法。我想在 onPostExecute 中得到结果。为此,我尝试使用 bool 参数,该参数仅在 onpostexecute 中为真。 B 类将检查直到它为真,当它为真时,它将获取结果。

但这会以某种方式阻止应用程序。

我已将 asynctask 的代码放在下面。

'

import java.io.IOException;

import org.apache.http.client.ClientProtocolException;

import org.apache.http.client.HttpClient;

import org.apache.http.client.ResponseHandler;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.impl.client.BasicResponseHandler;

import org.apache.http.impl.client.DefaultHttpClient;


import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;

public class A extends AsyncTask<String, Void, String>
{
private Context context = null;

private final HttpClient httpClient = new DefaultHttpClient();

private String content = null;
//private String error = null;
private String finalResult = null;
private static boolean isResult = false;

private ProgressDialog progressDialog = null;

public BabbleVilleSyncTask(Context context)
{
this.context = context;
progressDialog = new ProgressDialog(this.context);
}

protected void onPreExecute()
{
progressDialog.setMessage("Please Wait....");
progressDialog.show();
}

protected String doInBackground(String... urls)
{
try
{
//urls[0] = URLEncoder.encode(urls[0], "UTF-8");

HttpGet httpget = new HttpGet(urls[0]);
ResponseHandler<String> responseHandler = new BasicResponseHandler();
content = httpClient.execute(httpget, responseHandler);
}
/*catch(UnsupportedEncodingException ue)
{
error = ue.getMessage();
}*/
catch (ClientProtocolException e)
{
//error = e.getMessage();
cancel(true);
}
catch (IOException e)
{
//error = e.getMessage();
cancel(true);
}

httpClient.getConnectionManager().shutdown();

return content;
}

protected void onPostExecute(String result)
{
finalResult = result;
progressDialog.dismiss();
System.out.println("on Post execute called");
isResult = true;
}

public boolean getIsResult()
{
return isResult;
}

public void setIsResult(boolean flag)
{
isResult = flag;
}

public String getResult()
{
return finalResult;
}
}

'

谁能告诉我可能是什么问题?

问候

苏尼尔

最佳答案

使用 AsyncTask 获取结果的一种简洁方法是使用回调接口(interface)。

下面是这个概念的一个简单例子:

interface AsyncTaskCompleteListener<T> {
public void onTaskComplete(T result);
}

然后在你的 B 类:

class B implements AsyncTaskCompleteListener<String> {

public void onTaskComplete(String result) {
// do whatever you need
}

public void launchTask(String url) {
A a = new A(context, this);
a.execute(url);
}
}

您现在应该将以下代码添加到您的 A 类中:

class A extends AsyncTask<String, Void, String> {
private AsyncTaskCompleteListener<String> callback;

public A(Context context, AsyncTaskCompleteListener<String> cb) {
this.context = context;
this.callback = cb;
}

protected void onPostExecute(String result) {
finalResult = result;
progressDialog.dismiss();
System.out.println("on Post execute called");
callback.onTaskComplete(result);
}
}

这样,您不需要明确地等待任务完成,相反,您的主代码(可能是主 UI 线程)正在正常的 android 事件循环中等待,onTaskComplete 方法将是自动调用,允许在那里处理任务结果。

关于android - Android中AsyncTask的通用类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3291490/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com