如何停止执行,直到所有异步任务在android中执行完毕?

AndroidNewBee

我的启动画面中有多个asynctask在for循环中运行。我希望应用程序在所有异步任务完成之前停止执行。我想用异步任务的总数和任务的完成来更新UI线程,例如如果有3个任务和1个完成,我想显示1 / 3完成。这是循环的代码:-

 String[] images = Parse_imgJSON.image;
        for (int i = 0; i < images.length; i++) {
            Log.d("Image ", images[i]);
            download_img(images[i]);
        }

download_img()的代码:-

public void download_img(String img_url) {
    String fileName = img_url.substring(img_url.lastIndexOf('/') + 1, img_url.length());
    File file = new File("/storage/emulated/0/rready_images/" + fileName);

    if (file.exists() && !file.isDirectory()) {
        Log.d("Image exists", fileName);

    } else {
        if (fileName.contains(".jpg") || fileName.contains(".gif") || fileName.contains(".png")) {
            new DownloadImagesAsync().execute(img_url);
        } else {
            Log.d("IMAGE DOWNLOAD ", "FAILED FOR " + fileName);

        }

    }
}

用于下载文件的实际异步任务代码:-

     class DownloadImagesAsync extends AsyncTask<String, String, String> {

        Boolean isSDPresent = android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);

        private String resp;
        int lengthOfFile;

        @Override
        protected String doInBackground(String... params) {


            int count;

            try {
                URL url = new URL(params[0]);
                URLConnection connection = url.openConnection();
                connection.connect();

                lengthOfFile = connection.getContentLength();
                Log.d("ANDRO_ASYNC", "LENGTH OF FILE : " + lengthOfFile);

                String fileName = params[0].substring(params[0].lastIndexOf('/') + 1, params[0].length());
                Log.d("FILENAME", fileName);
                resp = fileName;

                if (isSDPresent) {

                    InputStream inputStream = new BufferedInputStream(url.openStream());
                    OutputStream outputStream = new FileOutputStream("sdcard/rreadyreckoner_images/" + fileName);
                    byte data[] = new byte[1024];
                    long total = 0;
                    while ((count = inputStream.read(data)) != -1) {
                        total += count;
                        outputStream.write(data, 0, count);
                    }

                    outputStream.flush();
                    outputStream.close();
                    inputStream.close();
                } else {
                    InputStream inputStream = new BufferedInputStream(url.openStream());
                    OutputStream outputStream = new FileOutputStream(getFilesDir() + "/rreadyreckoner_images/" + fileName);
                    byte data[] = new byte[1024];
                    long total = 0;
                    while ((count = inputStream.read(data)) != -1) {
                        total += count;
                        outputStream.write(data, 0, count);
                    }

                    outputStream.flush();
                    outputStream.close();
                    inputStream.close();

                }


            } catch (Exception e) {
                e.printStackTrace();
            }
            return params[0];
        }

        @Override
        protected void onPostExecute(String filename) {
            Log.d("PARAM", filename + " Downloaded ");

            String fname = filename.substring(filename.lastIndexOf('/') + 1, filename.length());

            Log.d("LENGTH OF FILE : ", String.valueOf(lengthOfFile));

            if (isSDPresent) {

                File f = new File("/storage/emulated/0/rreadyreckoner_images/" + fname);
                if (f.length() < lengthOfFile) {
                    if (f.delete()) {

                        //  Toast.makeText(RReadySplash.this, "Download was interrupted please try again!", Toast.LENGTH_SHORT).show();
                        Log.d("Del", "File deleted");
                    } else {

                        Log.d("NOTDel", "File not deleted");
                    }
                } else {

                    // dbHandler.updateDownloadStatus(image_id, "YES");

                }

            } else {

                File f = new File("/storage/emulated/0/rreadyreckoner_images/" + fname);
                if (f.length() < lengthOfFile) {
                    if (f.delete()) {

                        Log.d("Del", "File deleted");
                    } else {

                        Log.d("NOTDel", "File not deleted");
                    }
                } else {

//                    dbHandler.updateDownloadStatus(image_id, "YES");


                }


            }


        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();

        }

        @Override
        protected void onProgressUpdate(String... values) {
            Log.d("ANDRO_ASYNC", values[0]);

        }
    }

任何帮助或建议,表示赞赏。谢谢你。

维亚切斯拉夫

有很多方法。

例如,您可以使用接口回调。

创建一个接口:

public interface MyCallback {
    public void readycallback(int index_thread);
}

改变类:

    class DownloadImagesAsync extends AsyncTask<String, String, String> {
private int id = 0;
private    MyCallback callback;
            Boolean isSDPresent = android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);

            private String resp;
            int lengthOfFile;
    public DownloadImagesAsync(int id, MyCallback callback) {
this.id = id;
this.callback = callback;
}
            @Override
            protected String doInBackground(String... params) {


                int count;

                try {
                    URL url = new URL(params[0]);
                    URLConnection connection = url.openConnection();
                    connection.connect();

                    lengthOfFile = connection.getContentLength();
                    Log.d("ANDRO_ASYNC", "LENGTH OF FILE : " + lengthOfFile);

                    String fileName = params[0].substring(params[0].lastIndexOf('/') + 1, params[0].length());
                    Log.d("FILENAME", fileName);
                    resp = fileName;

                    if (isSDPresent) {

                        InputStream inputStream = new BufferedInputStream(url.openStream());
                        OutputStream outputStream = new FileOutputStream("sdcard/rreadyreckoner_images/" + fileName);
                        byte data[] = new byte[1024];
                        long total = 0;
                        while ((count = inputStream.read(data)) != -1) {
                            total += count;
                            outputStream.write(data, 0, count);
                        }

                        outputStream.flush();
                        outputStream.close();
                        inputStream.close();
                    } else {
                        InputStream inputStream = new BufferedInputStream(url.openStream());
                        OutputStream outputStream = new FileOutputStream(getFilesDir() + "/rreadyreckoner_images/" + fileName);
                        byte data[] = new byte[1024];
                        long total = 0;
                        while ((count = inputStream.read(data)) != -1) {
                            total += count;
                            outputStream.write(data, 0, count);
                        }

                        outputStream.flush();
                        outputStream.close();
                        inputStream.close();

                    }


                } catch (Exception e) {
                    e.printStackTrace();
                }
                return params[0];
            }

            @Override
            protected void onPostExecute(String filename) {
                Log.d("PARAM", filename + " Downloaded ");
    if (callback != null) {
callback.readycallback(myid);
}
                String fname = filename.substring(filename.lastIndexOf('/') + 1, filename.length());

                Log.d("LENGTH OF FILE : ", String.valueOf(lengthOfFile));

                if (isSDPresent) {

                    File f = new File("/storage/emulated/0/rreadyreckoner_images/" + fname);
                    if (f.length() < lengthOfFile) {
                        if (f.delete()) {

                            //  Toast.makeText(RReadySplash.this, "Download was interrupted please try again!", Toast.LENGTH_SHORT).show();
                            Log.d("Del", "File deleted");
                        } else {

                            Log.d("NOTDel", "File not deleted");
                        }
                    } else {

                        // dbHandler.updateDownloadStatus(image_id, "YES");

                    }

                } else {

                    File f = new File("/storage/emulated/0/rreadyreckoner_images/" + fname);
                    if (f.length() < lengthOfFile) {
                        if (f.delete()) {

                            Log.d("Del", "File deleted");
                        } else {

                            Log.d("NOTDel", "File not deleted");
                        }
                    } else {

    //                    dbHandler.updateDownloadStatus(image_id, "YES");


                    }


                }


            }

            @Override
            protected void onPreExecute() {
                super.onPreExecute();

            }

            @Override
            protected void onProgressUpdate(String... values) {
                Log.d("ANDRO_ASYNC", values[0]);

            }
        }

使用此类更改主函数

String[] images = Parse_imgJSON.image;
        for (int i = 0; i < images.length; i++) {
            Log.d("Image ", images[i]);
            download_img(images[i], i);
        }




 public void download_img(String img_url, int i) {
        String fileName = img_url.substring(img_url.lastIndexOf('/') + 1, img_url.length());
        File file = new File("/storage/emulated/0/rready_images/" + fileName);

        if (file.exists() && !file.isDirectory()) {
            Log.d("Image exists", fileName);



            } else {
                if (fileName.contains(".jpg") || fileName.contains(".gif") || fileName.contains(".png")) {
                    new DownloadImagesAsync(i, new MyCallback() {
@Override
    public void readycallback(int index_thread) {

    //this is your ready callback

    }
    }).execute(img_url);
                } else {
                    Log.d("IMAGE DOWNLOAD ", "FAILED FOR " + fileName);

                }

            }
    }

不要忘记检查您是否使用主UI线程:

如果需要,可以通过以下功能包装更新:

@Override
    public void readycallback(int index_thread) {

    //this is your ready callback
    runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    //this is your ready callback in main UI
//I do not remember if onPostExecute is in main UI thread
                }
            });
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Swift:阻塞所有代码,直到函数执行完毕

来自分类Dev

PHP执行停止,直到文件下载完毕

来自分类Dev

完成所有异步Http请求后执行功能

来自分类Dev

完成所有异步Http请求后执行功能

来自分类Dev

如何使Parallel等待所有异步任务完成?

来自分类Dev

如何阻止任务执行,直到所有任务都已提交?

来自分类Dev

取消所有异步任务

来自分类Dev

如何在 Django 中执行异步任务?

来自分类Dev

当它们超过阈值时停止所有异步任务吗?

来自分类Dev

节点在执行代码之前等待所有异步调用

来自分类Dev

确保主线程不会在执行所有异步方法之前死亡

来自分类Dev

回显“。” 直到命令执行完毕

来自分类Dev

是否可以检测所有异步任务何时挂起?

来自分类Dev

所有异步任务都可以读取的变量

来自分类Dev

如何在Vuejs中停止执行直到获取请求完成

来自分类Dev

使用Boost.Log时如何停止所有异步接收器

来自分类Dev

Tornado - 如何从 on_connection_close 停止所有异步“等待”

来自分类Dev

具有异步功能执行的PySide应用程序

来自分类Dev

如何在Python 3.4中执行异步任务?

来自分类Dev

如何使用delay_jobs在Rails中执行异步任务?

来自分类Dev

在用户输入存储在异步任务所需的变量中之前,如何阻止异步任务执行

来自分类Dev

具有依赖关系的异步任务执行

来自分类Dev

如何停止角度执行,直到加载了JSON?

来自分类Dev

在C ++中收到输入时如何停止执行异步功能

来自分类Dev

在Activity中调用finish()包含两个同时执行异步任务的片段无法销毁和停止异步任务

来自分类Dev

异步函数执行完毕后的C#执行函数

来自分类Dev

在C#中异步执行多个任务

来自分类Dev

在异步任务中强制关闭窗口执行

来自分类Dev

jBPM 6.2如何添加可以执行所有任务的用户?

Related 相关文章

  1. 1

    Swift:阻塞所有代码,直到函数执行完毕

  2. 2

    PHP执行停止,直到文件下载完毕

  3. 3

    完成所有异步Http请求后执行功能

  4. 4

    完成所有异步Http请求后执行功能

  5. 5

    如何使Parallel等待所有异步任务完成?

  6. 6

    如何阻止任务执行,直到所有任务都已提交?

  7. 7

    取消所有异步任务

  8. 8

    如何在 Django 中执行异步任务?

  9. 9

    当它们超过阈值时停止所有异步任务吗?

  10. 10

    节点在执行代码之前等待所有异步调用

  11. 11

    确保主线程不会在执行所有异步方法之前死亡

  12. 12

    回显“。” 直到命令执行完毕

  13. 13

    是否可以检测所有异步任务何时挂起?

  14. 14

    所有异步任务都可以读取的变量

  15. 15

    如何在Vuejs中停止执行直到获取请求完成

  16. 16

    使用Boost.Log时如何停止所有异步接收器

  17. 17

    Tornado - 如何从 on_connection_close 停止所有异步“等待”

  18. 18

    具有异步功能执行的PySide应用程序

  19. 19

    如何在Python 3.4中执行异步任务?

  20. 20

    如何使用delay_jobs在Rails中执行异步任务?

  21. 21

    在用户输入存储在异步任务所需的变量中之前,如何阻止异步任务执行

  22. 22

    具有依赖关系的异步任务执行

  23. 23

    如何停止角度执行,直到加载了JSON?

  24. 24

    在C ++中收到输入时如何停止执行异步功能

  25. 25

    在Activity中调用finish()包含两个同时执行异步任务的片段无法销毁和停止异步任务

  26. 26

    异步函数执行完毕后的C#执行函数

  27. 27

    在C#中异步执行多个任务

  28. 28

    在异步任务中强制关闭窗口执行

  29. 29

    jBPM 6.2如何添加可以执行所有任务的用户?

热门标签

归档