私のアプリはサーバーからデータを取得する必要があります。したがって、メソッドで ProgressDialog を表示し、onPreExecute()
メソッドdoInBackground()
でデータがサーバーからロードされます。
この時点で向きを変えるとアプリが強制終了します。現在のアクティビティが破棄され、doInBackground()
がまだ古いアクティビティを参照している可能性があるためです。そのため、同じ問題について説明しているこの投稿を参照しました。android:configchanges
しかし、私はそれが好まれていないので使いたくありません。androiddevelopersiteによると、これは最後の手段であり、ほとんどのアプリケーションには適していません。
それで、私のアプリが強制終了しないような方法で状況を処理する方法について、必要なコードスニペットで誰かが提案できますか?
Eidt: 私のコード
public class DataListActivity extends BaseActivity {
private ArrayList<String> valueslist;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.listlayout);
new LoadAsync().execute();
}
class LoadAsync extends AsyncTask<String, String, String> {
/**
* Before starting background thread Show Progress Dialog
* */
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = new ProgressDialog(DataListActivity.this);
progressDialog.setMessage("Loading...");
progressDialog.setIndeterminate(false);
progressDialog.setCancelable(false);
progressDialog.show();
}
/**
* getting All datafrom url
* */
protected String doInBackground(String... args) {
//Here I am doing httppost request.
try{
// looping through All data that I got from the server
for (int i = 0; i < subCategoriesJson.length(); i++) {
JSONObject jsonobj = subCategoriesJson.getJSONObject(i);
// Storing each json item in variable
String item = jsonobj.getString("data");
valueslist.add(item);
}
return "1";
}
else {
return null;
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(String msg) {
if( msg != null && msg.equals("1"))
{
progressDialog.dismiss();
runOnUiThread(new Runnable() {
public void run() {
//Updating parsed json data to Listview
ListView listView = (ListView)findViewById(R.id.list1);
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(getApplicationContext(),R.layout.list_item, valueslist);
listView.setAdapter(arrayAdapter);
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
String selectedthing = valueslist.get(position);
}
});
}
});
}else
{
//There is no data.
}
}
}
}
注:この質問には必要ありませんが、この情報を提供しています。私のアクティビティには 2 つのレイアウト ファイルがあります。1 つはポートレート用で、もう 1 つはフォルダー内のランドスケープモード用です。layout-land
以下は logcat ウィンドウです。
02-27 19:54:40.294: E/WindowManager(11710): Activity com.example.DataList has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@40555388 that was originally added here
02-27 19:54:40.294: E/WindowManager(11710): android.view.WindowLeaked: Activity com.example.prog.DataList has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@40555388 that was originally added here
02-27 19:54:40.294: E/WindowManager(11710): at android.view.ViewRoot.<init>(ViewRoot.java:277)
02-27 19:54:40.294: E/WindowManager(11710): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
02-27 19:54:40.294: E/WindowManager(11710): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
02-27 19:54:40.294: E/WindowManager(11710): at android.view.Window$LocalWindowManager.addView(Window.java:433)
02-27 19:54:40.294: E/WindowManager(11710): at android.app.Dialog.show(Dialog.java:265)
02-27 19:54:40.294: E/WindowManager(11710): at com.example.prog.DataList$LoadAsync.onPreExecute(DataList.java:77)
02-27 19:54:40.294: E/WindowManager(11710): at android.os.AsyncTask.execute(AsyncTask.java:391)
02-27 19:54:40.294: E/WindowManager(11710): at com.example.prog.DataList.onCreate(DataList.java:52)
02-27 19:54:40.294: E/WindowManager(11710): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1072)
02-27 19:54:40.294: E/WindowManager(11710): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1794)
02-27 19:54:40.294: E/WindowManager(11710): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1851)
02-27 19:54:40.294: E/WindowManager(11710): at android.app.ActivityThread.access$1500(ActivityThread.java:132)
02-27 19:54:40.294: E/WindowManager(11710): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1038)
02-27 19:54:40.294: E/WindowManager(11710): at android.os.Handler.dispatchMessage(Handler.java:99)
02-27 19:54:40.294: E/WindowManager(11710): at android.os.Looper.loop(Looper.java:150)
02-27 19:54:40.294: E/WindowManager(11710): at android.app.ActivityThread.main(ActivityThread.java:4277)
02-27 19:54:40.294: E/WindowManager(11710): at java.lang.reflect.Method.invokeNative(Native Method)
02-27 19:54:40.294: E/WindowManager(11710): at java.lang.reflect.Method.invoke(Method.java:507)
02-27 19:54:40.294: E/WindowManager(11710): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-27 19:54:40.294: E/WindowManager(11710): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-27 19:54:40.294: E/WindowManager(11710): at dalvik.system.NativeStart.main(Native Method)
02-27 19:54:40.294: E/ResourceType(11710): Style contains key with bad entry: 0x010102f3
02-27 19:54:40.294: E/ResourceType(11710): Style contains key with bad entry: 0x01010300
02-27 19:54:40.294: E/ResourceType(11710): Style contains key with bad entry: 0x0101039c