Async task downloader will fail when the connectio

2019-05-10 17:56发布

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import android.os.AsyncTask;
import android.util.Log;

public class IssueDownload extends AsyncTask<IRPack, Void, IRPack> {
    public static final String TAG = "IssueDownload";
    public String path = null;
    public IRIssue issue = null;

    @Override
    protected IRPack doInBackground(IRPack... parms) {
        InputStream input = null;
        OutputStream output = null;
        HttpURLConnection connection = null;
        issue =  Broker.model.issueDataStore.getIRIssue(parms[0].pubKey);

        try {       
            File downloadFile = new File(IRConstant.issueFolder(issue.year, issue.month, issue.day, issue.pubKey) + "/" + parms[0].currPage + ".zip");

            if (!downloadFile.exists()) {
                path = IRConstant.downloadFile(issue.year, issue.month, issue.day, issue.pubKey, "content", ""
                        + parms[0].currPage);
                URL url = new URL(path);

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

                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(IRConstant.issueFolder(issue.year, issue.month, issue.day, issue.pubKey) + "/" + parms[0].currPage + ".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 parms[0];
    }

    @Override
    protected void onPostExecute(IRPack pack) {
        // TODO Auto-generated method stub
        super.onPostExecute(pack);
        pack.downloadPackComplete(); // Unzip completed pack
    }
}

I am currently using this download class , the problem is , when I lost connection it simply fail and exit the apps, please are there any way to include try and error : retry connection if fail , if connect is not success after retry 2 times., then make a toast. Thanks

2条回答
成全新的幸福
2楼-- · 2019-05-10 18:08

u will make your own logic to hit 2 times for download the file if your file not downloaded, because when network will disconnected then downloading will stop.

查看更多
Summer. ? 凉城
3楼-- · 2019-05-10 18:09

the first thing to do is check connectivity before making requests.

 ConnectivityManager connMgr = (ConnectivityManager) 
        getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
    if (networkInfo != null && networkInfo.isConnected()) {
        // fetch data
    } else {
        // display error
    }

Second :

private String downloadUrl(String myurl) throws IOException {
    InputStream is = null;
    // Only display the first 500 characters of the retrieved
    // web page content.
    int len = 500;

    try {
        URL url = new URL(myurl);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setReadTimeout(10000 /* milliseconds */);
        conn.setConnectTimeout(15000 /* milliseconds */);
        conn.setRequestMethod("GET");
        conn.setDoInput(true);
        // Starts the query
        conn.connect();
        int response = conn.getResponseCode();
        Log.d(DEBUG_TAG, "The response is: " + response);
        is = conn.getInputStream();

        // Convert the InputStream into a string
        String contentAsString = readIt(is, len);
        return contentAsString;

    // Makes sure that the InputStream is closed after the app is
    // finished using it.
    } finally {
        if (is != null) {
            is.close();
        } 
    }
}

Make the part of your code throw an IOException as shown above

查看更多
登录 后发表回答