【问题标题】:Android AsyncTask not being called in for loopAndroid AsyncTask 未在 for 循环中调用
【发布时间】:2020-01-11 14:57:36
【问题描述】:

我正在从事一个项目,我需要从服务器的文件夹中下载文件。我有这个代码可以从网上下载一个图像。

    public class GetImages extends AsyncTask<Object, Object, Object> {

    private String requestUrl, imagename_;
    private Bitmap bitmap ;
    private FileOutputStream fos;

    protected GetImages(String requestUrl, String _imagename_) {
        this.requestUrl = requestUrl;
        this.imagename_ = _imagename_ ;
    }

    @Override
    protected Object doInBackground(Object... objects) {
        try {
            URL url = new URL(requestUrl+ imagename_);
            URLConnection conn = url.openConnection();
            bitmap = BitmapFactory.decodeStream(conn.getInputStream());

        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
        return null;
    }

    @Override
    protected void onPostExecute(Object o) {
        if(!ImageStorage.checkifImageExists(imagename_))
        {
            ImageStorage.saveToSdCard(bitmap, imagename_);
        }
    }
}

要下载单个图像,我会像这样调用 AsyncTask:

new GetImages(getString(R.string.link), "1.jpg").execute();

而且效果很好。问题是我想下载更多图片,所以我有这样的东西:

public void AdicionarImagem_Pasta() {

    for (int i : arrayID) {
        new GetImages(getString(R.string.link), i + ".jpg").execute();
    }
}

由于某种原因,它不会下载任何东西,甚至第一个也不会。 有人知道如何解决这个问题吗? 感谢您的帮助和您的时间。

【问题讨论】:

  • 该方法是否在第一次调用时被调用?另外,尝试通过GetImages("your link").executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)并行执行AsyncTask
  • 感谢您的回复。我试过new GetImages(getString(R.string.link), i + ".jpg").executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 但它不起作用

标签: java android image server download


【解决方案1】:

它不起作用,因为你所有的AsyncTasks 将进入同一个queue 等待对方被执行。要绕过它,您可以使用AsyncTask.THREAD_POOL_EXECUTOR,但如果您查看文档,则不建议这样做:

从 Build.VERSION_CODES.HONEYCOMB 开始,任务在一个 单线程避免并行导致的常见应用错误 执行。

如果你真的想要并行执行,你可以调用 executeOnExecutor(java.util.concurrent.Executor, java.lang.Object[]) 使用 THREAD_POOL_EXECUTOR。

但是不要在循环中创建这么多AsyncTask 的实例,这可能会消耗内存并且这是非常糟糕的方法,而是重构你的代码。

将图像urls 的List 传递给AsyncTask 并在doInBackground 方法中运行for 循环。在doInBackground 方法中,从urls 下载图像存储在Bitmaps 的List 中,并在下载完成后传递给onPostExecute。

在这里您可以找到工作示例: https://android--examples.blogspot.com/2017/02/android-asynctask-download-multiple.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    相关资源
    最近更新 更多