Java 从另一个项目中AsyncTask的onPostExecute()更新UI小部件

Java 从另一个项目中AsyncTask的onPostExecute()更新UI小部件,java,android,multithreading,android-fragments,android-asynctask,Java,Android,Multithreading,Android Fragments,Android Asynctask,因此,我想在ImageView中显示一个图像,该图像从网站下载并保存在设备的文件系统中。图像的下载是通过调用另一个类中的方法来完成的(在我的一个单独的库项目中)。此方法反过来调用AsyncTask在另一个线程中进行下载。在这个异步任务的后期执行中,我想为ImageView设置映像。请记住,这个单独的库独立于我的主应用程序,对我的UI一无所知(我希望保持这种方式) 我在代码的UI部分(在片段中)有一个方法,用于设置此ImageView的图像。我认为最好将这个方法传递给检索图像的库方法。这样,下载完

因此,我想在ImageView中显示一个图像,该图像从网站下载并保存在设备的文件系统中。图像的下载是通过调用另一个类中的方法来完成的(在我的一个单独的库项目中)。此方法反过来调用AsyncTask在另一个线程中进行下载。在这个异步任务的后期执行中,我想为ImageView设置映像。请记住,这个单独的库独立于我的主应用程序,对我的UI一无所知(我希望保持这种方式)

我在代码的UI部分(在片段中)有一个方法,用于设置此ImageView的图像。我认为最好将这个方法传递给检索图像的库方法。这样,下载完成后,onPostExecute()可以调用我拥有的这个UI方法。我面临的困境是,我不希望我的库有任何引用UI/ImageView的编译时依赖关系

最后,并非每次调用此AsyncTask时,我都希望在执行后执行中执行任何操作。换句话说,任何后执行逻辑都是完全可选的

一般流程: 1) 我的片段中的代码调用MyLib.saveRemoteFile(url,destinationFilename)

2) MyLib.saveRemoteFile()下载映像并通过线程(通过异步任务)将其保存到文件中

3) 下载并保存图像后,我想使用保存文件中的位图设置ImageView.setImageBitmap()

我已经看过了命令模式,但是我一直在研究如何在这个特定场景中实现它。有什么建议吗

也许还有另一种方法可以使用?(如果MyLib.saveRemoteFile()与UI没有编译时依赖关系)

UI片段代码片段:

.
boolean wasSaved = MyLib.saveRemoteFile(url, destinationFilename, true)
.
.
.
public static boolean saveRemoteFile(String url, String filename, boolean overwriteExistingFile)
{
    .
    // code to check if directory exist and creates it if needed, etc, etc...
    .
    .
    .
    new AsyncTask<String, Void, Boolean>() {
        @Override
        protected Boolean doInBackground(String... params)
        {
            // code to download and save image file...
            .
            .
            .
        }

        @Override
        protected void onPostExecute(Boolean result)
        {
            // *** this is where I want to take the ImageView and set its bitmap image.
        }
    }.execute(new String[] {url, filename});

    return retVal;
}
库代码片段(在不同的库项目中)

.
boolean wasSaved = MyLib.saveRemoteFile(url, destinationFilename, true)
.
.
.
public static boolean saveRemoteFile(String url, String filename, boolean overwriteExistingFile)
{
    .
    // code to check if directory exist and creates it if needed, etc, etc...
    .
    .
    .
    new AsyncTask<String, Void, Boolean>() {
        @Override
        protected Boolean doInBackground(String... params)
        {
            // code to download and save image file...
            .
            .
            .
        }

        @Override
        protected void onPostExecute(Boolean result)
        {
            // *** this is where I want to take the ImageView and set its bitmap image.
        }
    }.execute(new String[] {url, filename});

    return retVal;
}
公共静态布尔存储远程文件(字符串url、字符串文件名、布尔覆盖现有文件)
{
.
//检查目录是否存在并在需要时创建它的代码,等等。。。
.
.
.
新建异步任务(){
@凌驾
受保护的布尔doInBackground(字符串…参数)
{
//下载并保存图像文件的代码。。。
.
.
.
}
@凌驾
受保护的void onPostExecute(布尔结果)
{
//***这是我要拍摄ImageView并设置其位图图像的位置。
}
}.execute(新字符串[]{url,filename});
返回返回;
}
命令模式


您应该更注重实现,并且您的下载库应该允许其他代码附加侦听器,并在某些操作完成/启动/任何时候收到通知。而且,由于您刚刚被告知发生了一些事情,所以如果需要,您可以在应用程序的每个部分使用完全不同的代码对该通知做出反应。

设计有缺陷,库应该为您提供观察者设计模式,您可以使用它提交侦听器引用以及下载详细信息

下载完成后,使用您提供的侦听器的库会将下载过程的结果通知给您,您可以使用UI轻松地读取这些结果

此外,在库代码saveRemoteFile()中生成了一个asynctask,返回值在这里是不相关的,因为该方法不会等到asynctask被执行

根据上述信息可能实施

    // Interface for bserving
    public interface DownloadListsner{
        public void onSuccess(String uri);
        public void onError(String uri);
    }
    // API for submitting download request
    public void saveRemoteFile(String url, String filename,DownloadListsner listener... ){

        ...
    }

    AsyncTask{
        // Upon finish execution
        onPostExecute(){

// Take action
            listener.onSuccess

            or 

            listener.onError
        }
    }

您不能在非ui线程中保存吗?您可以将接口实现为库中的回调方法。@dtheo,保存是在非ui线程中完成的。它在异步任务中@Muthu,这就是我用一个简单的监听器界面所做的。谢谢谢谢,马辛。我将@Techfist的答案标记为正确。您的也是正确的,但他更详细地介绍了如何在我现有的代码中实现这一点。我试图对你的答案投赞成票,但我没有足够的分数。当我有足够的分数时,我会记下一个笔记回来投票。谢谢谢谢根据你的建议,我已经实现了一个简单的本地监听器。我将更深入地研究java.util.Observer类,以满足未来的需要。另外,感谢您指出代码中的返回值问题。