【问题标题】:Android anonymous callback functionsAndroid匿名回调函数
【发布时间】:2013-05-26 20:08:12
【问题描述】:

我开发了一个类来管理我对服务器的所有 API 调用(通过AsyncTask) 问题是,我想在doInBackground() 之后,在onPostExecute() 中向外部传递一个回调函数,该函数将在onPostExecute() 中执行。

这样,我可以保持我的通信类通用,并且 Activity 会向它发送一个回调来激活和更新 UI。

知道我该怎么做吗?

谢谢!

【问题讨论】:

标签: android android-asynctask


【解决方案1】:

虽然接受了答案,但只需添加另一个真正的匿名实现。希望这对其他人有帮助。

你的接口:你可以在 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
}

Activity 类的实现:

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

此外,您应该记住,如果需要根据imageDownloaderCallBack 返回值更新任何 Ui 元素,您应该在函数本身中编写该代码。

【讨论】:

    【解决方案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....");
        }
    }
    

    }

    要运行代码,您只需使用实现OnCommandFinished 的类调用like(...)

    【讨论】:

    • 对于respondTo 参数,您会将什么传递给like(...)
    • respondTo 只是预期结果的接口,即调用者。调用者通过调用带有一些参数的like 方法来启动这件事,这实际上取决于您的实现。
    猜你喜欢
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多