亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Android中AsyncTask的通用類?

Android中AsyncTask的通用類?

慕村9548890 2019-10-24 10:27:51
我有一個共同的階級說的如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 回答

?
繁星點點滴滴

TA貢獻1803條經驗 獲得超3個贊

使用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-10-24
?
智慧大石

TA貢獻1946條經驗 獲得超3個贊

你能再詳細點嗎?我目前正在嘗試轉換此方法:public static int invokeWebServiceRequest(String uri,String username,String password,String targetKey); 在擴展AsyncTask的類中。我如何將那些參數(從舊方法中)傳遞給doInBackground(Params ...)?謝謝!

查看完整回答
反對 回復 2019-10-24
  • 3 回答
  • 0 關注
  • 432 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號