如何在异步任务下载器中重试?

时间:2013-12-19 16:33:32

标签: android asynchronous android-asynctask download

public class PreviewDownload extends AsyncTask<String, Void, String> {
    public static final String TAG = "PreviewDownload";
    public String inputPath = null;
    public String outputFolder = null;
    public IRIssue issue = null;

    @Override
    protected String doInBackground(String... parms) {
        InputStream input = null;
        OutputStream output = null;
        HttpURLConnection connection = null;
        issue =  Broker.model.issueDataStore.getIRIssue(parms[0]);
        outputFolder = IRConstant.issueFolder(issue.year, issue.month, issue.day, issue.pubKey);

        try {
            inputPath = IRConstant.downloadFile(issue.year, issue.month, issue.day, issue.pubKey, "preview", "0");
            URL url = new URL(inputPath);

            Log.d (TAG,"input: " + inputPath);

            connection = (HttpURLConnection) url.openConnection();
            connection.connect();

            if (connection.getResponseCode() != HttpURLConnection.HTTP_OK)
                return null;
            // return "Server returned HTTP " + connection.getResponseCode()
            // + " " + connection.getResponseMessage();

            // download the file
            input = connection.getInputStream();
            output = new FileOutputStream(outputFolder + "/preview.zip");

            Log.d (TAG,"output: " + output);

            byte data[] = new byte[1024];
            int count;
            while ((count = input.read(data)) != -1) {
                output.write(data, 0, count);
            }
        } catch (Exception e) {
            // return e.toString();
            return null;
        } finally {
            try {
                if (output != null)
                    output.close();
                if (input != null)
                    input.close();
            } catch (IOException ignored) {
            }

            if (connection != null)
                connection.disconnect();

        }
        return outputFolder;
    }

    @Override
    protected void onPostExecute(String outputFolder) {
        // TODO Auto-generated method stub
        super.onPostExecute(outputFolder);
        if (outputFolder != null) {
            File zipFile = new File (outputFolder + "/preview.zip");
            if (Utils.unzip(outputFolder,outputFolder + "/preview.zip" )) {
                zipFile.delete();
                issue.isThumbDownloaded = 1;
            } else {
                issue.isThumbDownloaded = 0;
            }
        } else {
            Toast.makeText(Broker.launcherActivity.getBaseContext(), R.string.wordCantDownload, Toast.LENGTH_LONG).show();
            issue.isThumbDownloaded = 0;
        }
        issue.updateProgress(issue.progress);
    }
}

这是我实现的下载器,问题是,当网络丢失时,输出变为空并显示错误消息,但是,如果我想在显示错误消息之前重试两次,有没有办法做到这一点?如果我使用传递对象而不是字符串,是不是不推荐?感谢

2 个答案:

答案 0 :(得分:1)

int expectedLength = connection.getContentLength(); 你能比较预期的长度吗?下载长度并重试?

答案 1 :(得分:1)

是什么阻止您在发生错误时从catch块重新安装并重新执行“Downloader”?

您可以在dowloader实例之间使用单个公共共享对象来计算尝试次数,或者更好地将参数传递给每个尝试。在catch块中,如果没有达到限制,则会重试,并增加传递给新下载器的值...递归的东西。