2016-04-03 3 views
0

Я использую volley для загрузки данных JSON.Приложение вылетает, когда onResponse называется

Это MainActivity

public class MainActivity extends AppCompatActivity 
     implements NavigationView.OnNavigationItemSelectedListener { 

    private final String TAG = "MainActivity"; 


    //Creating a list of posts 
    private List<PostItems> mPostItemsList; 

    //Creating Views 
    private RecyclerView recyclerView; 
    private RecyclerView.Adapter adapter; 
    private RecyclerView.LayoutManager layoutManager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Log.d(TAG, "Device rotated and onCreate called"); 

     //Initializing Views 
     recyclerView = (RecyclerView) findViewById(R.id.post_recycler); 
     layoutManager = new LinearLayoutManager(this); 
     recyclerView.setLayoutManager(layoutManager); 


     //Initializing the postlist 
     mPostItemsList = new ArrayList<>(); 
     adapter = new PostAdapter(mPostItemsList, this); 

     recyclerView.setAdapter(adapter); 

     if (NetworkCheck.isAvailableAndConnected(this)) { 
      //Caling method to get data 
      getData(); 
     } else { 
      final Context mContext; 
      mContext = this; 
      final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); 
      alertDialogBuilder.setTitle("No Internet Connection"); 
      alertDialogBuilder.setMessage("Failed to load. Please ensure you're connected to the internet and try again."); 
      alertDialogBuilder.setPositiveButton("Retry", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        if (!NetworkCheck.isAvailableAndConnected(mContext)) { 
         alertDialogBuilder.show(); 
        } else { 
         getData(); 
        } 


       } 
      }); 
      alertDialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        finish(); 

       } 
      }); 
      alertDialogBuilder.show(); 

     } 

    } 

    //This method will get data from the web api 
    private void getData(){ 

     Log.d(TAG, "getData called"); 
     //Showing progress dialog 
     final ProgressDialog progressDialog = ProgressDialog.show(this, null, "Loading posts", false, false); 

     //Creating a json request 
     JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(ConfigPost.GET_URL, 
       new Response.Listener<JSONArray>() { 
        @Override 
        public void onResponse(JSONArray response) { 
         Log.d(TAG, "onResponse called"); 
         //Dismissing the progress dialog 
         progressDialog.dismiss(); 


         //calling method to parse json array 
         parseData(response); 

        } 
       }, 
       new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 

        } 
       }); 

     //Creating request queue 
     RequestQueue requestQueue = Volley.newRequestQueue(this); 

     //Adding request to the queue 
     requestQueue.add(jsonArrayRequest); 
    } 


} 

Если запустится приложение, и я не повернуть его, он загружает & разбирает JSON довольно хорошо; но если приложение запускается и я несколько раз поворачиваю устройство, приложение вылетает, как только вызывается onResponse.

Это StackTrace

04-03 12:46:10.493 22221-22221/com.example.poster D/MainActivity: Device rotated and onCreate called 
04-03 12:46:10.493 22221-22221/com.example.poster D/MainActivity: getData called 
04-03 12:46:11.234 22221-22221/com.example.poster D/MainActivity: Device rotated and onCreate called 
04-03 12:46:11.234 22221-22221/com.example.poster D/MainActivity: getData called 
04-03 12:46:12.675 22221-22221/com.example.poster D/MainActivity: Device rotated and onCreate called 
04-03 12:46:12.685 22221-22221/com.example.poster D/MainActivity: getData called 
04-03 12:46:14.096 22221-22221/com.example.poster D/MainActivity: Device rotated and onCreate called 
04-03 12:46:14.096 22221-22221/com.example.poster D/MainActivity: getData called 
04-03 12:46:15.278 22221-22221/com.example.poster D/MainActivity: Device rotated and onCreate called 
04-03 12:46:15.288 22221-22221/com.example.poster D/MainActivity: getData called 
04-03 12:46:15.448 22221-22221/com.example.poster D/MainActivity: onResponse called 
04-03 12:46:15.448 22221-22221/com.example.poster E/AndroidRuntime: FATAL EXCEPTION: main 
                    Process: com.example.poster, PID: 22221 
                    java.lang.IllegalArgumentException: View=com.android.internal.policy.impl.PhoneWindow$DecorView{7873bab V.E..... R......D 0,0-480,174} not attached to window manager 
                     at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:396) 
                     at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:322) 
                     at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:116) 
                     at android.app.Dialog.dismissDialog(Dialog.java:341) 
                     at android.app.Dialog.dismiss(Dialog.java:324) 
                     at com.example.poster.MainActivity$4.onResponse(MainActivity.java:142) 
                     at com.example.poster.MainActivity$4.onResponse(MainActivity.java:137) 
                     at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:65) 
                     at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99) 
                     at android.os.Handler.handleCallback(Handler.java:739) 
                     at android.os.Handler.dispatchMessage(Handler.java:95) 
                     at android.os.Looper.loop(Looper.java:135) 
                     at android.app.ActivityThread.main(ActivityThread.java:5910) 
                     at java.lang.reflect.Method.invoke(Native Method) 
                     at java.lang.reflect.Method.invoke(Method.java:372) 
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405) 
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200) 

От StackTrace, линия 142 является progressDialog.dismiss(); и линия 137 является new Response.Listener<JSONArray>() {

Любая идея, что может быть причиной этого, и это решение?

UPDATE: Я думал о кодировании, поэтому getData() вызывается только тогда, когда приложение создано в первый раз. Это потому, что getData() вызывается, когда активность восстанавливается после изменения конфигурации (в данном случае, вращения). Это приводит к перезагрузке. Это возможно? То есть для вызова getData() только в первый раз, действие создается.

+0

поставить код parseData –

+0

Но StackTrace не упоминаю parseData? Это действительно необходимо? Поправьте меня, если я ошибаюсь. – Faraday

+0

Изменить 'final ProgressDialog progressDialog = ProgressDialog.show (this, null, «Loading posts», false, false); 'to' OnCreate()' – Kathi

ответ

5

Когда приложение вращается, activity воссоздан. Теперь у вас есть экземпляр ProgressDialogprogressDialog. Поэтому, когда активность вращается, старая активность разрушается, и, таким образом, этот экземпляр progressDialog уничтожается.

Теперь задача выполняется на фоновом потоке и когда он возвращается, он не мог найти progressDialog, как он был разрушен и, таким образом, в настоящее время not attached to window manager (IllegalArgumentException).

Для этого лучше проверить экземпляр progressDialog перед его обращением onResponse.

Попробуйте использовать ProgressDialog так:

Определение глобального экземпляра: private ProgressDialog progressDialog;

В getData метода:

private void getData(){ 

    Log.d(TAG, "getData called"); 
    //Showing progress dialog 
    progressDialog = new ProgressDialog(MainActivity.this); 
    progressDialog.setMessage("Loading posts"); 
    progressDialog.show(); 

В onResponse обратного вызова:

if(progressDialog!=null){ 
    progressDialog.hide(); 
} 

onDestroy деятельности:

if(progressDialog!=null) progressDialog.dismiss(); // to prevent memory leak 
+0

Как это сделать? И PLS, я обновил вопрос. – Faraday

+0

Спасибо, сэр! Он работал как магия! Но у меня есть вопросы coupla: почему мы не назвали 'progressDialog.dismis()' прямо из 'onRespose' и забыли об этом в' onDestroy'? И, во-вторых, не могу ли я остановить вызов getData() ', когда активность будет восстановлена ​​после изменения конфигурации? – Faraday

0

Необходимо убрать объект null при увольнении progressdialog.

ProgressDialog progressDialog = ProgressDialog.show(this, null, "Loading posts", false, false); 

if(progressDialog!=null) 
progressDialog.dismiss(); 
Смежные вопросы