主UI线程等待其他线程完成

时间:2014-04-25 13:34:33

标签: java android multithreading

在我的应用程序中,我必须显示一些图像。它们存储在设备上。但是,如果某些图片未保存在设备上,则应从网上下载。 问题是我必须显示下载动画(例如,简单的圆形进度条,只是旋转动画或简单图片),下载完成后,只需重新加载包含图片的视图。所以我在UI线程中有以下代码:

if(notDownloaded)
{
    Methods.downloadFile(fileparams);
    ImageView iv = new ImageView(context);
    iv.setImageResource(R.drawable.downloading);
    listOfPictures.add(iv);
}

Methods.downloadFile()

public static void downloadFile(DCFile _dcFile, Context _context) {

    final DCFile dcFile = _dcFile;
    final Context context = _context;

    Thread thread = new Thread(){

        @Override
        public void run(){

            String response = "";
            try {
                Download download = new Download();
                response = download.execute(dcFile,context).get();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }

            if(response.equals("OK"))
            {
                downloadFinished.onDownloadFinished(); //interface-event
            }
        }
    };

    thread.run();
} 

onDownloadFinished刷新图片视图。 班级Download

public class Download extends AsyncTask<Object, Void, String>
{
@Override
protected String doInBackground(Object... params) {
    DCFile dcFile = (DCFile) params[0];
    Context context = (Context) params[1];
    try {
        URL url = new URL(dcFile.getPath() + dcFile.getFileName());
        File file;
        if(dcFile.getType() == 0)
        {
            File dir = new File(context.getFilesDir(), "pics/");
            if(!dir.exists())
                dir.mkdirs();
            file = new File(context.getFilesDir(), "pics/" + dcFile.getUid());
        }
        else
        {
            File dir = new File(context.getFilesDir(), "voices/");
            if(!dir.exists())
                dir.mkdirs();
            file = new File(context.getFilesDir(), "voices/" + dcFile.getUid());
        }
        if(file.exists())
            return "";

        FileUtils.copyURLToFile(url, file, 5000, 10000);

    } catch (MalformedURLException e) {
        e.printStackTrace();
        return "";
    } catch (IOException e) {
        e.printStackTrace();
        return "";
    }
    return "OK";
}

}

因此,如果错过了一些照片,我应该看到R.drawable.downloading,然后,当下载照片时,我已经看过那张照片了。 但是,当图片下载时我看到黑屏,然后是那张图片。 所以我意识到UI线程在图片下载完成时等待。

如何解决这个问题?错误在哪里?

0 个答案:

没有答案