2015-01-01 4 views
3

Я не могу понять, что не так, на моем устройстве приложение работает красиво, но иногда в журнале (пользователи приложений, сеансы, сбои ... отслеживание через некоторую службу) я вижу крах приложения (NullPointerException), Тост не может быть запущен, поскольку переменная активности равна нулю.Иногда фрагмент теряет активность

Линия 45 (метод populateCats() генерирует исключение NullPointerException)

package package.name; 

import android.app.Activity; 
import android.os.Bundle; 
import android.support.v4.app.ListFragment; 
import android.view.View; 
import android.widget.ListView; 
import android.widget.Toast; 

import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 

import java.util.ArrayList; 


public class CatsList extends ListFragment implements OnTaskCompleted { 
    Document doc; 
    MainActivity activity; 
    ArrayList<Cat> cats; 

    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     super.onListItemClick(l, v, position, id); 
     Cat cat = cats.get(position); 

     //SOME CODE 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     new GetData(activity, this, false).execute(Jsoup.connect(MainActivity.url)); 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     this.activity = (MainActivity) activity; 
    } 

    public void populateCats(){ 
     if(doc == null) 
     { 

      Toast.makeText(activity, "Error....", Toast.LENGTH_SHORT).show(); 
      return; 
     } 
     Toast.makeText(activity, "Success....", Toast.LENGTH_SHORT).show(); 

     //SOME CODE 
    } 


} 

Вход:

java.lang.NullPointerException 
at android.widget.Toast.<init>(Toast.java:98) 
at android.widget.Toast.makeText(Toast.java:254) 
at PACKAGE_NAME.CatsList.populateCats(CatsList.java:64) 
at PACKAGE_NAME.CatsList.taskCompleted(CatsList.java:92) 
at PACKAGE_NAME.GetData.onPostExecute(GetData.java:61) 
at PACKAGE_NAME.GetData.onPostExecute(GetData.java:12) 
at android.os.AsyncTask.finish(AsyncTask.java:631) 
at android.os.AsyncTask.access$600(AsyncTask.java:177) 
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:4921) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794) 
at dalvik.system.NativeStart.main(Native Method) 

AndroidManifect.xml также Android, содержа-: configChanges = "keyboardHidden | ориентация |" Размер экрана

+0

Попытайтесь перейти от переменной activity к getActivity() в тостах. У вас переменная activity не установлена ​​правильно ... Можно ли использовать справочную информацию о действии, которую вы получаете из onAttach (Activity activity)? Например: this.activity = активность по вышеупомянутому методу? – user1086500

+0

ПОЧЕМУ? onAttach метод вызова перед заполнениемCats() и там я сохраню ссылку на активность. p.s. Я попробовал этот метод также – IceJOKER

+0

Попробуйте: this.activity = getActivity() в onActivityCreated (Bundle). См. Http://developer.android.com/reference/android/app/Fragment.html#onActivityCreated(android.os.Bundle) – user1086500

ответ

5

Если я правильно понял, метод populateCats() называется асинхронно классом GetData. Это означает, что существует несколько перемежений, где асинхронная процедура все еще выполняется, когда пользователь закрывает активность. Это вызовет NPE, потому что, если вы правильно применили onAttach/onDetach, вы очищаете ссылку на активность, когда фрагмент отсоединяется после закрытия действия.

Как хорошая практика, вы всегда должны проверять состояние каждой ссылки на действие или вызов getActivity() и проверять, что они не являются нулевыми, прежде чем выполнять какую-либо другую инструкцию.

+0

да, вы правы, GetData вызывает другой метод, который вызывает populateCats(); Спасибо)) Я думаю, что ты прав насчет моей проблемы) – IceJOKER

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