Android中的多线程

时间:2017-12-05 13:05:10

标签: java android multithreading

我是Android和Java的新手。我正在尝试下载1000多张图片。我不想在UI线程中连续执行此操作,因为这将很慢。因此,我使用线程和runnable以下面的方式实现了 multi-threading

for循环将被称为1000多次。那么它是实现它的有效方式吗? OS会自己管理线程池吗?

private void syncS3Data() {
    tStart = System.currentTimeMillis();
    try {
        for (final AWSSyncFile f : awsSyncData.getFiles()) {
            new Thread(new Runnable() {

                @Override
                public void run() {
                    beginDownload(f);
                }

            }).start();
        }
    } catch (Exception ex) {
        progressDialog.dismiss();
        showMessage("Error:" + ex.getStackTrace().toString());
    }
}

3 个答案:

答案 0 :(得分:2)

当然你不能在MainThread(UI Thread)中做到这一点,因为如果你这样做,应用程序将不会响应..然后它将被系统杀死,你可以使用AsyncTask类来做什么做你需要但我更喜欢使用intentservice 但是你必须使用Intentservice它是一个工作线程(长操作),但要注意,intentservice在完成当前任务之前不会执行任何操作,如果你需要并行下载它,那么你必须使用它与UI线程一起工作所以你需要asyncTask才能执行操作,但确保调用stopSelf()与intentService不同,它将在完成后停止

答案 1 :(得分:1)

不是为每次下载创建线程,而是创建一个线程并使用它来下载所有图像。

您可以使用AsyncTask参考:https://developer.android.com/reference/android/os/AsyncTask.html

private class DownloadFilesTask extends AsyncTask<SomeObject, Integer, Long> {
    protected Long doInBackground(SomeObject... objs) {

        for (final AWSSyncFile f : obj.getFiles()) {
           beginDownload(f);
        }
    }

    protected void onPostExecute(Long result) {
       //Task Completed
    }

new DownloadFilesTask().execute(someObj);

答案 2 :(得分:1)

之前我开发过一个电子商务应用程序并且遇到过类似的问题,我必须为每个类别下载200多个图像。我这样做的方法是在AsyncTask中使用循环并在每次下载完成后使用onProgessUpdate()函数在相关位置显示图像。我无法共享实际代码,因此我将给出一个框架示例。

public class DownloadImages extends AsyncTask<String,String,String>
{
  File image;
  protected String doInBackground(String... params)
    {
      //download the image here and lets say its stored in the variable file
      //call publishProgress() to run onProgressUpdate()


    }
  protected void onProgressUpdate(String... values)
  {
     //use the image in variable file to update the UI
  }
}