Мое приложение должно получать данные с сервера. Поэтому я показываю ProgressDialog в методе onPreExecute()
и в методе 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
Некоторый код может быть полезен также. coz, когда у меня есть активный ProgressDialog, я могу без проблем переключать ориентацию. – bofredo