Check if the file has stopped downloading

I am using AsyncTask like this:

public class DownloadTask extends AsyncTask<String, Integer, String> {
ProgressDialog mProgressDialog;
        private Context context;
        private PowerManager.WakeLock mWakeLock;
        String fileName=null;
        public DownloadTask(Context context,ProgressDialog Dialog) {
            this.context = context;
            this.mProgressDialog=Dialog;
        }

        @Override
        protected String doInBackground(String... sUrl) {
            InputStream input = null;
            OutputStream output = null;
            HttpURLConnection connection = null;
            try {
                URL url = new URL(sUrl[0]);
                connection = (HttpURLConnection) url.openConnection();
                connection.connect();

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


                String raw = connection.getHeaderField("Content-Disposition");

             if(raw != null && raw.indexOf("=") != -1) {
                  fileName = raw.split("=")[1];
                  fileName=fileName.split(";")[0];
                  fileName=fileName.substring(1, fileName.length()-1);
             } else {

             }
                File f=new File(context.getFilesDir()+"/"+fileName);
               if(!f.exists())
               {Log.d("TAG","DOES NOT EXIST , downloading");

                int fileLength = connection.getContentLength();

                input = connection.getInputStream();

                Log.d("Tag", raw);
                Log.d("Tag",fileName);
                output = new FileOutputStream(context.getFilesDir()+"/"+fileName);

                byte data[] = new byte[4096];
                long total = 0;
                int count;
                while ((count = input.read(data)) != -1) {

                    if (isCancelled()) {
                        input.close();
                        File check =new File(context.getFilesDir()+"/"+fileName);
                        check.delete();
                        return null;
                    }
                    total += count;

                    if (fileLength > 0) 
                        publishProgress((int) (total * 100 / fileLength));
                    output.write(data, 0, count);
                }
            } }catch (Exception e) {
                return e.toString();
            } finally {
                try {
                    if (output != null)
                        output.close();
                    if (input != null)
                        input.close();
                } catch (IOException ignored) {
                }

                if (connection != null)

                    connection.disconnect();


            }
            return null;


        }


        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
            mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                 getClass().getName());
            mWakeLock.acquire();
            mProgressDialog.show();
        }

        @Override
        protected void onProgressUpdate(Integer... progress) {
            super.onProgressUpdate(progress);

            mProgressDialog.setIndeterminate(false);
            mProgressDialog.setMax(100);
            mProgressDialog.setProgress(progress[0]);
        }

        @Override
        protected void onPostExecute(String result) {
            mWakeLock.release();
            mProgressDialog.dismiss();
            if (result != null)
                Toast.makeText(context,"Download error: "+"Please check your internet connection!", Toast.LENGTH_LONG).show();
            else
            { Toast.makeText(context,"File downloaded", Toast.LENGTH_SHORT).show();
            Intent i=new Intent(context,MuPDFActivity.class);
            Uri uri=Uri.parse(context.getFilesDir()+"/"+fileName);
            i.setAction(Intent.ACTION_VIEW);
            i.setData(uri);
            context.startActivity(i);
            }
        }}

      

This works effectively when I call this from my activity and the files are loaded. But, if the download is interrupted (if the user opens the list of open applications and forced terminations), the partially downloaded file remains and is current. I do not want to resume the download, I want to delete the file if the download was interrupted . How should I do it?

+3


source to share


2 answers


jitain sharma The idea of ​​a solution to cancel the asyntact did not work (when the force terminated the application, it was not called).

So, in the end, I used sharedPreferences to "mark" the end of the file upload in my AsyncTask onPostExecute () method. I just check the result if everything is ok (then the line will be empty), I add a SharedPreference with the filename with the value "DONE".

Before executing AsyncTask, I check if file exists AND if sharedPreference exists.

public class DownloadTask extends AsyncTask<String, Integer, String> {
ProgressDialog mProgressDialog;
        private Context context;
        private PowerManager.WakeLock mWakeLock;
        String fileName=null;
        public DownloadTask(Context context,ProgressDialog Dialog) {
            this.context = context;
            this.mProgressDialog=Dialog;
        }

        @Override
        protected String doInBackground(String... sUrl) {
            InputStream input = null;
            OutputStream output = null;
            HttpURLConnection connection = null;
            try {
                URL url = new URL(sUrl[0]);
                connection = (HttpURLConnection) url.openConnection();
                connection.setReadTimeout(3000);
                connection.setConnectTimeout(5000);
                connection.connect();

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


                String raw = connection.getHeaderField("Content-Disposition");

             if(raw != null && raw.indexOf("=") != -1) {
                  fileName = raw.split("=")[1];
                  fileName=fileName.split(";")[0];
                  fileName=fileName.substring(1, fileName.length()-1);
             } else {

             }
                File f=new File(context.getFilesDir()+"/"+fileName);
               if(!f.exists())
               {Log.d("TAG","DOES NOT EXIST , downloading");

                int fileLength = connection.getContentLength();

                input = connection.getInputStream();

                Log.d("Tag", raw);
                Log.d("Tag",fileName);
                output = new FileOutputStream(context.getFilesDir()+"/"+fileName);

                byte data[] = new byte[4096];
                long total = 0;
                int count;
                while ((count = input.read(data)) != -1) {

                    if (isCancelled()) {
                        input.close();
                        File check =new File(context.getFilesDir()+"/"+fileName);
                        check.delete();
                        return null;
                    }
                    total += count;

                    if (fileLength > 0) 
                        publishProgress((int) (total * 100 / fileLength));
                    output.write(data, 0, count);
                }
            } }catch (Exception e) {
                return e.toString();
            } finally {
                try {
                    if (output != null)
                        output.close();
                    if (input != null)
                        input.close();
                } catch (IOException ignored) {
                }

                if (connection != null)

                    connection.disconnect();


            }
            return null;


        }


        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
            mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                 getClass().getName());
            mWakeLock.acquire();
            mProgressDialog.show();
        }

        @Override
        protected void onProgressUpdate(Integer... progress) {
            super.onProgressUpdate(progress);

            mProgressDialog.setIndeterminate(false);
            mProgressDialog.setMax(100);
            mProgressDialog.setProgress(progress[0]);
        }

        @Override
        protected void onPostExecute(String result) {
            mWakeLock.release();
            mProgressDialog.dismiss();
            if (result != null)
            {File file=new File(context.getFilesDir()+File.separator+fileName);
            file.delete();
                Toast.makeText(context,"Download error: "+"Please check your internet connection!", Toast.LENGTH_LONG).show();
            }
    //**THIS IS THE CHANGE**           else
            { SharedPreferences p=PreferenceManager.getDefaultSharedPreferences(context);
            Editor editor=p.edit();
           editor.putString(fileName, "DONE");
           editor.commit();


                    Toast.makeText(context,"File downloaded", Toast.LENGTH_SHORT).show();
            Intent i=new Intent(context,MuPDFActivity.class);
            Uri uri=Uri.parse(context.getFilesDir()+"/"+fileName);
            i.setAction(Intent.ACTION_VIEW);
            i.setData(uri);
            context.startActivity(i);
            }
        }}

      



And this is how I check:

if(!file.exists()||!PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).contains(fileName))

      

{new file (getFilesDir () + File.separator + "phychap1.pdf"). delete (); }

I am always open to better solutions

0


source


If the user even presses the home button or turns your device, the download will be aborted. Therefore, in the onStop () method, you must check the file not in the onPostExecute (String result), because it cannot call and can keep loading it. you can just check the end of the file to see if it has EOF or not and no SharedPreferences is required.



+1


source







All Articles