我的应用需要从服务器获取数据。因此,我在方法中显示ProgressDialogonPreExecute()
,并在该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.
}
}
}
}
注意:我正在提供此信息,尽管此问题不是必需的。我的活动有两个布局文件。一个用于纵向,另一个用于文件夹中的横向模式。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