IceJOKER IceJOKER - 1 month ago 8
Android Question

Sometimes fragment lose activity

I can't to understand what's wrong, on my device app working nice, but sometimes in log(app users,sessions, crashes ... tracking via some service) i see app crash(NullPointerException), Toast cann't be run because activity variable is null.

Line 45 (populateCats() method throws exception 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
}


}


Log:

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 also contain- android:configChanges="keyboardHidden|orientation|screenSize"

Answer Source

If I've assumed correctly, the method populateCats() is called asynchronously by the GetData class. This means that there are several interleaving where the asynchronous procedure is still running when the user close the activity. This will cause a NPE because, if you have implemented the onAttach/onDetach correctly, you are clearing the activity reference when the fragment is detached after the activity is closed.

As a good practice, you should always check the state of every Activity reference or getActivity() invocation and verify that they are not null before execute any other instruction.