在asynctask冲突中的Android progressdialog

时间:2012-03-27 07:32:00

标签: android android-asynctask progressdialog

我已经开发了一个简单的asynctask,附带了progressdialog,以显示给定任务的进度。

它们工作得很好,没有任何问题,而没有发生方向变化。我改变了设备的方向(我在真实设备上测试),对话框出现在窗口中。

我试图在方向更改时手动关闭该进度对话框,但似乎没有任何内容影响该对话框。

这是我的asynctask代码:

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 :(得分:0)

在Android Manifest文件的活动中添加以下属性。

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

答案 1 :(得分:0)

当设备方向改变时,android生命周期从onCreate方法重复。 因此,要在方向更改中处理进度对话框,您可以选择两种方法来设置acchange方向的configchanges标志。和其他选项是保持配置更改的状态,请参阅链接:

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