我是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());
}
}
答案 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
}
}