我已经开发了一个简单的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
答案 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?