AsyncTask を使用してサーバーから json ファイルを取得するアプリケーションがあるため、プログレス バーが表示されます。しかし、プログレス バーを表示し、方向を変更すると、アプリケーションがクラッシュし、 VIEW NOT ATTACHED エラーまたは HAS LEAKED WINDOW エラーが表示されます。
これらのエラーを取り除く方法は? それ以外の場合、アプリケーションは AsyncTask で正常に動作します。
AsyncTask を使用してサーバーから json ファイルを取得するアプリケーションがあるため、プログレス バーが表示されます。しかし、プログレス バーを表示し、方向を変更すると、アプリケーションがクラッシュし、 VIEW NOT ATTACHED エラーまたは HAS LEAKED WINDOW エラーが表示されます。
これらのエラーを取り除く方法は? それ以外の場合、アプリケーションは AsyncTask で正常に動作します。
AsyncTask の実行中に画面の向きを「ロック」するのはどうですか?!
例えば:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
サーバーから JSON ファイルを取得する直前に、
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
AsynTask が実行された後。
現在入手可能な限られた情報からの私の最善の推測:
画面を回転させると、必要に応じてonPause()、onStop()、およびonDestroy()の通常のアクティビティライフサイクルプロセスが実行されるため、これらのメソッドの1つでprogressDialogを閉じる必要があります。
私はそれをどのようにしたか:
@Override
protected void onPause()
{
super.onPause();
if (mProgressDialog != null)
mProgressDialog.dismiss();
}
あなたの活動のためにこれを試してください。あまりきれいではありませんが。それは助けることができます
<activity android:configChanges="orientation|screenSize" android:name=".activity.MyActivity" ></activity>
私がまとめたこの小さなハックを試してみてください...それを実行して、画面の変更とハードウェアの戻るキーを押すことのさまざまな組み合わせを試しながら、logcat 情報を観察してください。次に、以下のコメントに記載されている微調整を試して、さらにいじってください。これにより、望ましくない android:configChanges="orientation|screenSize" を回避できます。
これは、最小限のマニフェストと layout.xml ファイルを使用してそのままビルドする必要があります。どういうわけかそれを台無しにした場合は、コメントを残してください。
// ********************************************************************
// *** AsynchHack - allows for multiple screen orientation changes, ***
// *** multiple asynch tasks are started / stopped,progress ***
// *** dialogs handled gracefully (no memory leaks / etc). ***
// *** ***
// *** Remove the wrapping comments in the onCreate() function ***
// *** to restrict processing to a single asynch instantiation ***
// *** screen rotation will dismiss the progress meter, but not ***
// *** the task ***
// *** ***
// *** View the logcat to understand the timing of events and ***
// *** their interactions ***
// *** ***
// ********************************************************************
package com.example.AsynchHack;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import java.util.List;
// *** Main activity
public class AsynchHack extends Activity {
final static String debugClass = "AsynchHack";
ProgressDialog mProgressDialog;
// *** standard onCreate()
public void onCreate(Bundle aSavedInstanceState) {
super.onCreate(aSavedInstanceState);
Log.d(debugClass, "onCreate(" + this + ")");
setContentView(R.layout.layout);
// As-is, this allows for multiple starts of asynch tasks
//if (aSavedInstanceState == null) {
mProgressDialog = new ProgressDialog(this);
(new AsynchStartup()).execute();
//}
}
// *** demo Asynch task
private class AsynchStartup extends AsyncTask<Void, Void, Void> {
protected void onPreExecute() {
Log.d(debugClass,
"--- AsynchStartup() onPreExecute (" + this + ")");
mProgressDialog.setMessage("Loading please wait..");
mProgressDialog.show();
}
protected Void doInBackground(Void... aInput) {
Log.d(debugClass,
"--- AsynchStartup() doInBackground(" +
this + ") *starts*");
// simulate lengthy processing
try {
Thread.sleep(5000);
}
catch (InterruptedException aException) { }
Log.d(debugClass,
"--- AsynchStartup() doInBackground(" +
this + ") *finishes*");
return null;
}
protected void onProgressUpdate(Void aProgress){
}
protected void onPostExecute(Void aOutput) {
Log.d(debugClass,
"--- AsynchStartup() onPostExecute (" + this + ")");
if (mProgressDialog != null) {
Log.d(debugClass,
"--- AsynchStartup() onPostExecute " +
"(Dismissing progress meter)");
mProgressDialog.dismiss();
mProgressDialog = null;
}
else {
Log.d(debugClass,
"--- AsynchStartup() onPostExecute " +
"(Not required to dismiss progress meter)");
}
}
}
// *** standard onDestroy()
public void onDestroy() {
super.onDestroy();
Log.d(debugClass, "onDestroy(" + this + ")");
if (mProgressDialog != null) {
Log.d(debugClass,
"onDestroy(Dismissing progress meter)");
mProgressDialog.dismiss();
mProgressDialog = null;
}
else {
Log.d(debugClass,
"onDestroy(Not required to dismiss progress meter)");
}
}
}
これを使ってみてください
dialog.setCancelable(false);