Berat Eyüboğlu
Berat Eyüboğlu

Reputation: 1733

How can i pause download process via asynctask

I'm making an app with a download process, it will download a certain file. If I turn off the Wi-Fi when the file is downloading, the app crashes.

This is the log: recvfrom failed: ETIMEDOUT (Connection timed out)

I have a conditional, but it seems not to work. If I debug the code, it seems to enter the conditional.

else {
    Thread.sleep(4000); //doesn't work, doesn't sleep
    downloadresult = false;
}

I want the download process to pause when I turn off the Wi-Fi. Is there any way of doing this? Thanks in advance.

All code

 protected String doInBackground(String... f_url) {
        try {
            long total = 0;
            URL url = new URL(f_url[0]);
            HttpURLConnection conection = (HttpURLConnection) url.openConnection();
            int lenghtOfFile = conection.getContentLength();
            BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(file));
            conection.connect();
            BufferedInputStream input = new BufferedInputStream(conection.getInputStream());

            byte data[] = new byte[8192];
            int lastcount = 0;


            while ((count = input.read(data)) != -1) {

                if (isCanceled) { // this code waiting the click button :)
                    file.delete();
                    downloadresult = false;
                    break;
                }
                if (intCheck()) { // check internet and download
                    total += count;
                    downloadresult = true;
                    int ProgBarCount = (int) ((total * 100) / lenghtOfFile);
                    if (ProgBarCount > lastcount) {
                        lastcount = ProgBarCount;
                        publishProgress(Integer.toString(ProgBarCount));
                    }
                    output.write(data, 0, count);

                }
                else {

                     Thread.sleep(4000); //doesn't work, doesn't sleep
                     downloadresult = false;
                }

            }

            output.flush();
            output.close();
            input.close();
        }
        catch (Exception e) {

            e.printStackTrace();
         exmessage = e.getMessage().toString();
            downloadresult = false;

        }
        return null;
    }

If I debug the code, it works perfectly. If the app can't dowload the file, I want the app to wait 4000ms and then try again, but if I run the app, it crashes.

How can i pause/resume the download process. Thank You

Upvotes: 0

Views: 1223

Answers (2)

Berat Eyüboğlu
Berat Eyüboğlu

Reputation: 1733

I fixed the problem :)

Thanks for all respond, I love it <3

Code:

 protected String doInBackground(String... f_url) {
        try {
            long total = 0;
            URL url = new URL(f_url[0]);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

           /* if (file.exists())
            {
                connection.setAllowUserInteraction(true);
                connection.setRequestProperty("Range", "bytes=" + lenghtOfFile + "-");
            }*/

            if(file.exists()){
                deneme = file.length();
                connection.setRequestProperty("Range", "bytes="+(file.length())+"-");
            }
        else{
            connection.setRequestProperty("Range", "bytes=" + deneme + "-");
        }

            String connectionField = connection.getHeaderField("content-range");

            if (connectionField != null)
            {
                String[] connectionRanges = connectionField.substring("bytes=".length()).split("-");
                deneme = Long.valueOf(connectionRanges[0]);
            }

            if (connectionField == null && file.exists())
                file.delete();




            connection.setConnectTimeout(14000);
            connection.setReadTimeout(20000);
            connection.connect();



            long lenghtOfFile = connection.getContentLength() + deneme;
            RandomAccessFile output = new RandomAccessFile(file,"rw");
            BufferedInputStream input = new BufferedInputStream(connection.getInputStream());
            output.seek(deneme);
            byte data[] = new byte[1024];
            int lastcount = 0;


            while ((count = input.read(data,0,1024)) != -1) {

                if (isCanceled) { // this code waiting the click button :)
                    file.delete();
                    downloadresult = false;
                    break;
                }
                if (intCheck()) { // check internet and download
                    total += count;
                    downloadresult = true;
                    int ProgBarCount = (int) ((total * 100) / lenghtOfFile);
                    if (ProgBarCount > lastcount) {
                        lastcount = ProgBarCount;
                        publishProgress(Integer.toString(ProgBarCount));
                    }
                    output.write(data, 0, count);


                }


            }

           // output.flush();
            output.close();
            input.close();
        }
        catch (Exception e) {
            e.printStackTrace();
            exmessage = e.getMessage().toString();
            downloadresult = false;

        }
        return null;
    }

Upvotes: 1

danny117
danny117

Reputation: 5651

Don't pause background tasks. When anything goes wrong cancel the task. Remember your app was smart enough to start a background task. It will be smart enough to restart it again later. If your going to pause a background task it should be paused only at the users bequest.

Upvotes: 0

Related Questions