如果我在循环中调用它超过100次,AsyncTask会崩溃吗?

时间:2014-12-05 21:12:19

标签: android android-async-http

我从Web服务获取文件列表,然后使用AsyncTask处理所有文件的下载。每个任务都是在循环中创建的:

for(int i = 0; i < arraySize; i++) {
//Omitted all code except for the portion that fires the asynctask

    //Download the PDF
    DownloadHandler dhpdf = new DownloadHandler(cleanLink, fileName, p1, DownloadPosters.this, "pdf");
    dhpdf.startDownload();

    //Download the PNG
    DownloadHandler dhpng = new DownloadHandler(cleanLink, fileName, p1, DownloadPosters.this, "png");
    dhpng.startDownload();

}

下载课程

public class DownloadHandler extends Activity {

private Context mContext;
//File ======================
public String filename;
private String remotePath;
private File file;
private String ext;
//Progress bar ==============
private ProgressBar progressBar;
private int progressStatus = 0;
//private Handler handler = new Handler();
private TextView mTextView;
//ProgressDialog ============
ProgressDialog mProgress;
private int mProgressDialog=0;


public DownloadHandler(String rp, String f, ProgressBar progressBar, Context c, String extension, TextView textview) throws Exception {
    mContext = c;
    remotePath = rp;
    filename = f;
    file = new File(mContext.getFilesDir(), filename+"."+extension);
    ext = extension;
    this.progressBar = progressBar;
    mTextView = textview;
}

//our method
public void startDownload() {
    String url = "http://examplesite.com/"+remotePath+"/"+filename+"."+ext;

    new DownloadFileAsync().execute(url);
}

class DownloadFileAsync extends AsyncTask<String, Integer, String> {

    @Override
    public void onPreExecute() {

    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        progressBar.setProgress(values[0]);
        mTextView.setText("Downloading: "+ext); 
    }

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

        int count;

        try {
            URL url = new URL(aurl[0]);

            URLConnection conection = url.openConnection();
            conection.connect();
            // Get Music file length
            int lenghtOfFile = conection.getContentLength();
            // input stream to read file - with 8k buffer
            InputStream input = new BufferedInputStream(url.openStream(),10*1024);

            // Output stream to write file in internal storage
            OutputStream output = new BufferedOutputStream(new FileOutputStream(file));

            byte data[] = new byte[1024];
            long total = 0;
            while ((count = input.read(data)) != -1) {
                total += count;
                // Publish the progress which triggers onProgressUpdate method
                publishProgress((int) ((total * 100) / lenghtOfFile));

                // Write data to file
                output.write(data, 0, count);
            }
            // Flush output
            output.flush();
            // Close streams
            output.close();
            input.close();

        } catch (Exception e) {mTextView.setText("ERROR:"+e.toString());}
        return null;

    }

    @Override
    protected void onPostExecute(String unused) {
        mTextView.setText("Complete"); 
    }
}

现在我只能测试大约6个文件,它似乎运行良好。

我的问题是,如果这是排队多次下载的正确方法,并且一次可以处理100多个文件而不会崩溃吗?

2 个答案:

答案 0 :(得分:2)

为什么不使用Android下载管理器?您可以将所有下载请求排队,它是一项服务,它将在后台运行。它还会检查您的连接,在连接消失并重新建立后恢复下载。

有关详细信息和快速入门,请查看本教程。它应该有所帮助。 Vogella Blog

答案 1 :(得分:1)

100不应该是一个问题,但你也不应该做100次 paralel 上传 - 这样做不会太好(技术上它应该可以工作但是在性能方面)这是错误的方法)。我将它们排队并逐个推送。

请注意,根据Android版本,AsyncTask在默认情况下调用时的效果会有所不同&#34;表格&#34; (新的xxTask.execute()`) - 在旧版本上,如果将并行,从来没有它会一个接一个地去。确保您始终保持相同。

最后,如果您确实知道要上传100个上传文件,那么我就坐下来重新设计您应用程序的架构 - 那里肯定会有一些错误。