2014-10-25 4 views
0

Мое приложение состоит из 3 вкладок, и одна из вкладок переключает свои фрагменты на другой фрагмент. Оба фрагмента содержат списки. Моя проблема заключается в том, что если я нажму кнопку «Назад», когда список будет загружен данными из Интернета (с использованием asynctask), приложение выйдет из строя.Ошибка при смене фрагмента при обновлении listView

Функция, которая запускается на выполнение, когда 2-й фрагмент нагрузки: ошибка

void load(final String q) { 

    class HttpGetAsyncTask extends AsyncTask<String, Void, List<String>> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
     } 

     @Override 
     protected List<String> doInBackground(String... params) { 

      HttpClient httpClient = new DefaultHttpClient(); 
      HttpGet httpGet = new HttpGet("url"); 
      String v = null, c = null; 

      try { 
       HttpResponse httpResponse = httpClient.execute(httpGet); 
       InputStream inputStream = httpResponse.getEntity() 
         .getContent(); 
       InputStreamReader inputStreamReader = new InputStreamReader(
         inputStream); 
       BufferedReader bufferedReader = new BufferedReader(
         inputStreamReader); 
       StringBuilder stringBuilder = new StringBuilder(); 
       String bufferedStrChunk = null; 

       while ((bufferedStrChunk = bufferedReader.readLine()) != null) { 
        stringBuilder.append(bufferedStrChunk); 
       } 
       String js = stringBuilder.toString(); 

       try { 
         JSONObject jsonObj = new JSONObject(js); 
         String[] n = new String[17]; 
         for(int i = 6;i<=16;i++){ 
          n[i] = jsonObj.getString("" + i); 
         } 

         for(int i=6;i<=16;i++){ 
          HashMap<String, String> map = new HashMap<String, String>(); 
          map.put("r", label_eq[i]); 
          map.put("c", n[i]); 
          fillMaps.add(map); 
         } 

       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 

      } catch (ClientProtocolException cpe) { 
       cpe.printStackTrace(); 
      } catch (IOException ioe) { 
       ioe.printStackTrace(); 
      } 
      LIST.add(v); 
      LIST.add(c); 
      return LIST; 
     } 

     @Override 
     protected void onPostExecute(List<String> result) { 
      super.onPostExecute(result); 

      SimpleAdapter a = new SimpleAdapter(getActivity(), fillMaps,R.layout.my_list_item , from, to); //this is the line 158th line 
      l.setAdapter(a);  
     } 


    } 

    HttpGetAsyncTask httpGetAsyncTask = new HttpGetAsyncTask(); 
    httpGetAsyncTask.execute(); 
} 

LogCat:

10-25 12:43:34.423: E/AndroidRuntime(779): FATAL EXCEPTION: main 
10-25 12:43:34.423: E/AndroidRuntime(779): java.lang.NullPointerException 
10-25 12:43:34.423: E/AndroidRuntime(779): at android.widget.SimpleAdapter.<init>(SimpleAdapter.java:85) 
10-25 12:43:34.423: E/AndroidRuntime(779): at yash.proj.stocks.eq$1HttpGetAsyncTask.onPostExecute(eq.java:158) 
10-25 12:43:34.423: E/AndroidRuntime(779): at yash.proj.stocks.eq$1HttpGetAsyncTask.onPostExecute(eq.java:1) 
10-25 12:43:34.423: E/AndroidRuntime(779): at android.os.AsyncTask.finish(AsyncTask.java:631) 
10-25 12:43:34.423: E/AndroidRuntime(779): at android.os.AsyncTask.access$600(AsyncTask.java:177) 
10-25 12:43:34.423: E/AndroidRuntime(779): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
10-25 12:43:34.423: E/AndroidRuntime(779): at android.os.Handler.dispatchMessage(Handler.java:99) 
10-25 12:43:34.423: E/AndroidRuntime(779): at android.os.Looper.loop(Looper.java:137) 
10-25 12:43:34.423: E/AndroidRuntime(779): at android.app.ActivityThread.main(ActivityThread.java:5041) 
10-25 12:43:34.423: E/AndroidRuntime(779): at java.lang.reflect.Method.invokeNative(Native Method) 
10-25 12:43:34.423: E/AndroidRuntime(779): at java.lang.reflect.Method.invoke(Method.java:511) 
10-25 12:43:34.423: E/AndroidRuntime(779): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
10-25 12:43:34.423: E/AndroidRuntime(779): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
10-25 12:43:34.423: E/AndroidRuntime(779): at dalvik.system.NativeStart.main(Native Method) 
+0

Вы должны отменить свою задачу при уничтожении фрагмента. Сделайте свою задачу глобальной переменной и отмените ее на onDestroyView() функцию фрагмента. mTask.cancel (true) пример – hieuxit

+0

@hieuxit Как вы предлагаете мне сделать мою задачу глобальной переменной? Это внутри функции. –

+0

Поскольку onDestroyView() не обязательно вызывается каждый раз, я должен отменить его on onPause() –

ответ

0

Я не могу комментировать.

Since onDestroyView() is not necessarily called every time, I should cancel it on onPause()

Вы правы, и я предполагаю, что вы делаете это.

Пожалуйста, сообщите нам, если вы переопределили метод onBackPressed(). Предполагая, что у вас нет:

После отмены вы должны будете изменить метод onPostExecute(..) вашей AsyncTask. Заменить метод следующим:

@Override 
    protected void onPostExecute(List<String> result) { 
     super.onPostExecute(result); 
     if(isCancelled() || !isAdded()) { 
      //Fragment is not in a state to meaningfully use the Main thread 
      return; 
     } 
     SimpleAdapter a = new SimpleAdapter(getActivity(), fillMaps,R.layout.my_list_item , from, to); //this is the line 158th line 
     l.setAdapter(a);  
    } 

isAdded() метод заключается в обеспечении фрагмента добавляется активность согласно HERE

Альтернативно, isVisible() также может быть использован как мне кажется.

Вышеупомянутые должны решить ваши проблемы. Если вы по-прежнему сталкиваетесь с проблемами, сообщите родительскую активность фрагментов и логарифм.

Смежные вопросы