0

I've developed a simple asynctask with progressdialog attached to it, to show progress of the given task.

They work nice, without any problem, while no orientation change occur. I've I change orientation of my device (I'm testing on real device), the dialog appears stuck in window.

I've tryied to dismiss that progress dialog manually, when orientation change, but nothing seems to affect that dialog.

Here is my asynctask code:

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

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        showDialog(DOWNLOAD_PROGRESS_DIALOG);
    }

    @Override
    protected String doInBackground(String... params) {
        File file = null;
        try {
            URL url = new URL(fileURL);
            file = new File(fileName);

            if(!file.exists()){
                file.createNewFile();
            }else{
                return "0";
            }

            /* Open a connection to that URL. */
            URLConnection ucon = url.openConnection();

            int lenghtOfFile = ucon.getContentLength();
            /*
             * Define InputStreams to read from the URLConnection.
             */
            InputStream is = ucon.getInputStream();
            FileOutputStream fos = new FileOutputStream(file);

            byte[] buffer = new byte[1024];
            int len1 = 0;
            long total = 0;
            while((len1 = is.read(buffer)) > 0){
                total += len1;
                publishProgress("" + (int) ((total*100)/lenghtOfFile));
                fos.write(buffer, 0, len1);
            }
            fos.close();

            return "1";
        } catch (IOException e) {
            if(file != null && file.exists()){
                file.delete();
            }
            dismissDialog(DOWNLOAD_PROGRESS_DIALOG);

        }
        return "0";
    }
    @Override
    protected void onProgressUpdate(String... values) {
        try{
            downloadProgress.setProgress(Integer.parseInt(values[0]));
        }catch(Exception e){

        }
    }

    @Override
    protected void onPostExecute(String result) {
        downloadResult = result;    
        dismissDialog(DOWNLOAD_PROGRESS_DIALOG);
    }

}

And following is my oncreatedialog

@Override
protected Dialog onCreateDialog(int id) {
...
}case(DOWNLOAD_PROGRESS_DIALOG):{
        if(downloadProgress == null){
            downloadProgress = new ProgressDialog(this);
            downloadProgress.setOnDismissListener(new DialogInterface.OnDismissListener() {
                @Override
                public void onDismiss(DialogInterface dialog) { 
                    if(downloadResult == "1"){
                        FileStored newFileStored = new FileStored(fileName, new Date());
                        db.insertFile(newFileStored);
                        refreshLastDownload();
                        downloadResult = null;
                    }else{
                        showDialog(DOWNLOAD_PROBLEM);
                    }
                    downloadProgress = null;
                }
            });
            Resources r = getResources();
            downloadProgress.setMessage(r.getString(R.string.downloading));
            downloadProgress.setIndeterminate(false);
            downloadProgress.setMax(100);
            downloadProgress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            downloadProgress.setCancelable(true);
            downloadProgress.show();
        }
        return downloadProgress;
    }case(DOWNLOAD_PROBLEM):{
        if(this.downloadProblemDialog == null){
            TextView problemView = new TextView(this);
            problemView.setText(R.string.problem_download_text);
            AlertDialog.Builder problemDialog = new AlertDialog.Builder(this);
            problemDialog.setTitle(R.string.problem_download);
            problemDialog.setView(problemView);
            problemDialog.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {

                }
            });
            this.downloadProblemDialog = problemDialog.create();
        }
        return this.downloadProblemDialog;
    }
...

Finally, the call to async task

new DownloadFileAsync().execute(fileURL);

Can you find anything wrong that leads to this orientation change weird behaviour?

Thank you in advance,

Vyrphan

user989501
  • 1,833
  • 2
  • 13
  • 13

2 Answers2

0

Add below property in activity of Android Manifest file.

<activity android:name=".name" android:label="@string/app_name" 
    android:configChanges="touchscreen|keyboard|keyboardHidden|navigation|orientation"></activity>
Hasmukh
  • 4,632
  • 2
  • 30
  • 44
0

when orientation of device changes, android lifecycle repeats from onCreate method. So to handle your progress dialog accross orientation changes, you hace two alternatives one is to set configchanges flag of acivity to orientation. and other option is to retain states accross configuration changes, see link:

How to save state during orientation change in Android if the state is made of my classes?

Community
  • 1
  • 1
jeet
  • 29,001
  • 6
  • 52
  • 53