为了账号安全,请及时绑定邮箱和手机立即绑定

Android中AsyncTask的通用类?

Android中AsyncTask的通用类?

月关宝盒 2019-12-10 13:08:24
我有一个共同的阶级说的如A级延伸AsyncTask,并已实施即所有的方法onPreExecute,doinbackground和onPostExecute。现在,还有其他一些要使用Class A对象的类。假设B类以以下方式使用A类A a = new A(context)a.execute(url)然后我在get方法中获取结果。但是get方法不是使用AsyncTask的正确方法。我想在中得到结果onPostExecute。为此,我尝试使用布尔参数,该参数仅在中有效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;}有人可以让我知道可能是什么问题吗?
查看完整描述

3 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

使用AsyncTask获得结果的一种干净方法是使用回调接口。


这是此概念的一个简单示例:


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方法将被自动调用,允许在那里处理任务结果。



查看完整回答
反对 回复 2019-12-11
?
达令说

TA贡献1821条经验 获得超6个赞

你能再详细点吗?我目前正在尝试转换此方法:public static int invokeWebServiceRequest(String uri,String username,String password,String targetKey); 在扩展AsyncTask的类中。我如何将那些参数(从旧方法中)传递给doInBackground(Params ...)?谢谢!

查看完整回答
反对 回复 2019-12-11
  • 3 回答
  • 0 关注
  • 438 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信