我的應用需要從服務器獲取數據。所以我在ProgressDialogonPreExecute()
方法和doInBackground()
方法顯示數據從服務器加載。如何在方向改變時避免強制關閉
此時如果我改變方向,應用程序組合關閉。因爲當前活動已被破壞,並且doInBackground()
可能仍會引用舊活動。所以,我提到了this post,它討論了同樣的問題。但我不想使用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.
}
}
}
}
注:雖然這是沒有必要這個問題我提供此信息。我的活動有兩個佈局文件。一個是肖像和其他是爲風景模式在layout-land
文件夾。
以下是logcat的窗口:
02-27 19:54:40.294: E/WindowManager(11710): Activity com.example.DataList has leaked window [email protected] 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 [email protected] 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
發佈所有logcat數據...然後我們可以瞭解什麼是問題或什麼異常時發生強制關閉發生。 – Ajit 2013-02-27 12:44:26
一些代碼也可能有用。因爲當我有一個積極的ProgressDialog,我可以切換方向沒有任何麻煩。 – bofredo 2013-02-27 12:50:06