2013-02-27 5 views
0

Мое приложение должно получать данные с сервера. Поэтому я показываю 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 
+0

Опубликовать все данные logcat ... тогда мы сможем понять, в чем проблема или какие исключения были выброшены, когда произошло силовое закрытие. – Ajit

+0

Некоторый код может быть полезен также. coz, когда у меня есть активный ProgressDialog, я могу без проблем переключать ориентацию. – bofredo

ответ

3

Вы можете отключить изменения ориентации во время ожидания данных от сервера. Вы можете установить ориентацию портрет на мгновение:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

Для более четкие пояснения по адресу: How do I disable orientation change on Android?

+0

Я не хотел ограничивать изменение ориентации даже во время выполнения на этот момент. Более того, что, если пользователь начнет с пейзажа, а затем изменится на портрет? – Apparatus

+0

@Sam Я полагаю, что пользователи обычно открывают apk в портретном режиме, но вы правы. Но также вы можете заставить пользователя начать работу в портретном режиме, прежде чем начать загрузку данных с сервера. Если вы установите ориентацию перед своей обязанностью, пользователь не может изменить ее на пейзаж, пока вы не позволите ему снова. А также, если вы хотите, вы можете проверить ориентацию, затем установить ее пейзаж или портрет. Пожалуйста, проверьте посещение: http://stackoverflow.com/questions/4697631/android-screen-orientation – buttib

+0

Это взлом, и один с большим количеством побочных эффектов.Слишком много девайсов отключает ориентацию изменений в качестве быстрого решения, чтобы избежать необходимости изучать и кодировать жизненный цикл Activity. Без этого вы становитесь уязвимы ко всем другим вещам, которые могут уничтожить и воссоздать вашу деятельность, кроме изменений ориентации. – Simon

2

Вы должны отпустить диалог в onPause() и, в случае необходимости, показать его снова в onResume().

Возможно, вы захотите сохранить некоторое состояние о диалоге между экземплярами вашей деятельности, используя onRetainNonConfigurationInstance(), и получить его из пакета, переданного в onCreate().

+0

Спасибо за ваше время и +1. Я отредактирую свой вопрос с помощью моего кода. Не могли бы вы рассказать о том, как это сделать? – Apparatus

+0

Я обновил свой вопрос с кодом. Пожалуйста, проверьте. – Apparatus

0

Это тот же ответ, что и Саймон, но с примером кода. Вы должны проверить, завершен ли прогресс, иначе индикатор прогресса застрянет на 100%.

@Override 
public void onPause() { 
    super.onPause(); // Always call the superclass method first 

    proDialog.dismiss(); 
} 

@Override 
public void onResume(){ 
    super.onResume(); 


    proDialog.show(); 
} 
Смежные вопросы