Android прогрессдиалог и асинктаск конфликт - PullRequest
0 голосов
/ 27 марта 2012

Я разработал простую асинхронную задачу с прикрепленным к ней прогрессиалогом, чтобы показать ход выполнения данной задачи.

Они работают хорошо, без каких-либо проблем, пока не происходит изменение ориентации. Я меняю ориентацию своего устройства (я тестирую на реальном устройстве), диалоговое окно застревает в окне.

Я попытался закрыть это диалоговое окно прогресса вручную при изменении ориентации, но, похоже, ничто не влияет на это диалоговое окно.

Вот мой асинктасный код:

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);
    }

}

И вот мой 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;
    }
...

Наконец, вызов асинхронной задачи

new DownloadFileAsync().execute(fileURL);

Можете ли вы найти что-то неправильное, что приводит к странному поведению, которое меняет ориентацию?

Заранее спасибо,

Vyrphan

Ответы [ 2 ]

0 голосов
/ 27 марта 2012

при изменении ориентации устройства жизненный цикл андроида повторяется из метода onCreate.Таким образом, для управления вашим диалогом прогресса в зависимости от изменения ориентации у вас есть две альтернативы, одна из которых - установить флажок активности configchanges для ориентации.а другой вариант - сохранить состояния при изменениях конфигурации, см. ссылку:

Как сохранить состояние при изменении ориентации в Android, если состояние составлено из моих классов?

0 голосов
/ 27 марта 2012

Добавить свойство ниже в активности файла Android Manifest.

<activity android:name=".name" android:label="@string/app_name" 
    android:configChanges="touchscreen|keyboard|keyboardHidden|navigation|orientation"></activity>
...