2013-05-26 58 views
2

我已經開發了管理我所有的API調用到我的服務器(通過AsyncTask) 問題是,我的doInBackground()後想一類,在onPostExecute()通過外部將在執行的回調函數onPostExecute()Android的匿名回調函數

通過這種方式,我可以保持通信類的通用性,並且Activity會發送一個回調來激活和更新UI。

任何想法我該怎麼做?

謝謝!

+1

http://stackoverflow.com/questions/16752073/how-do-i-return-a-boolean-from-asynctask/16752189#16752189。用黑帶檢查答案。尋找類似的東西? – Raghunandan

回答

2

在這裏你去隊友:

public class ApiMethods { 

public interface OnCommandFinished { 
    public void onApiSuccess(String result); 
    public void onApiError(String error); 
} 

public void like(PARAMS .... , OnCommandFinished respondTo){ 
    new runRequestTask(respondTo).execute(uri, params); 
} 

private class runRequestTask extends AsyncTask<Object, Void, String>{ 

    private final OnAtomicCommandFinished mRespondTo; 

    public runRequestTask(OnCommandFinished respondTo){ 
     mRespondTo = respondTo; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     // IF SUCCESS 
     mRespondTo.onAtomicSuccess(result); 

     // IF ERROR 
     mRespondTo.onApiError("404...."); 
    } 
} 

}

運行的代碼,你只需撥打like(...)與實現OnCommandFinished

+0

你會爲「respondTo」參數傳入「like(...)」嗎? –

+1

'respondTo'只是預期結果的接口,調用者。調用者通過調用具有一些參數的''''''方法來啓動這個事情,這真的取決於您的實現。 – Sean

2

雖然答案已被接受,只是增加一個類,真實匿名執行。希望這有助於他人。

你的界面:你可以在AsyncTask類中實現這個。

public interface ImageLoaderListener{ 
    void imageDownloaderCallBack(Bitmap bmp); 
} 

的AsyncTask類的構造函數:

// declare interface variable 
private ImageLoaderListener listener; 
private String link; 

public ImageDownloader(String link, ImageLoaderListener listener){ 
    this.link = link; 
    this.listener = listener; 
} 

onPostExecution:

@Override 
protected void onPostExecute(Void result){ 
    listener.imageDownloaderCallBack(bitmap); 
    // your code, i was returning bitmap 
} 

在活動類實現:

ImageDownloader imageDownloader = new ImageDownloader(url, new ImageLoaderListener(){ 
    @Override 
    public void imageDownloaderCallBack(Bitmap bmp) { 
      // update Ui elements 
    } 
}); 
imageDownloader.execute(); 

另外,您應該記住,如果有任何UI元素需要根據imageDownloaderCallBack返回值進行更新,則應該將該代碼寫入函數本身。