I'm having an issue with following error:
E/AndroidRuntime(658): FATAL EXCEPTION: main E/AndroidRuntime(658): java.lang.NullPointerException E/AndroidRuntime(658): at android.view.LayoutInflater.from(LayoutInflater.java:210) E/AndroidRuntime(658): at com.gauss.sportsapp.messages.RecievedRequestsAdapter.(RecievedRequestsAdapter.java:26) E/AndroidRuntime(658): at com.gauss.sportsapp.messages.MessagesList.setRecievedRequests(MessagesList.java:157) E/AndroidRuntime(658): at com.gauss.sportsapp.messages.MessagesList.onEventsAvailable(MessagesList.java:181) E/AndroidRuntime(658): at com.gauss.sportsapp.eventrequests.GetEventRequestsTask.onPostExecute(GetEventRequestsTask.java:74) E/AndroidRuntime(658): at com.gauss.sportsapp.eventrequests.GetEventRequestsTask.onPostExecute(GetEventRequestsTask.java:1) E/AndroidRuntime(658): at android.os.AsyncTask.finish(AsyncTask.java:602) E/AndroidRuntime(658): at android.os.AsyncTask.access$600(AsyncTask.java:156) E/AndroidRuntime(658): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncT ask.java:615) E/AndroidRuntime(658): at android.os.Handler.dispatchMessage(Handler.java:99) E/AndroidRuntime(658): at android.os.Looper.loop(Looper.java:154) E/AndroidRuntime(658): at android.app.ActivityThread.main(ActivityThread.java:4945) E/AndroidRuntime(658): at java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime(658): at java.lang.reflect.Method.invoke(Method.java:511) E/AndroidRuntime(658): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) E/AndroidRuntime(658): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) E/AndroidRuntime(658): at dalvik.system.NativeStart.main(Native Method)
The error only occurs after I exit my application via home button and let it sit in the background for a while. If I just exit the app and instantly start it again, there's no error. Sometimes it even works after I let it sit for a while, but more often than not, it returns a null pointer for context when I set layout inflater in adapter's constructor.
Important code bits of my Fragment:
public class MessagesList extends Fragment implements EventRequestListener {
private ListView lv;
private GetEventRequestsTask recievedRequestsTask;
private List<GetEventRequest> data;
private RecievedRequestsAdapter adapter;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
recievedRequestsTask = new GetEventRequestsTask(getActivity(), user_id);
recievedRequestsTask.setEventRequestListener(MessagesList.this);
recievedRequestsTask.execute();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.fragment_messages, container, false);
}
//Async Task listener, gets called if(result != null)
@Override
public void onEventsAvailable(List<GetEventRequest> result) {
// TODO Auto-generated method stub
adapter = new RecievedRequestsAdapter(getActivity(), data);
lv.setAdapter(adapter);
}
@Override
public void onStop() {
// TODO Auto-generated method stub
super.onStop();
if(recievedRequestsTask != null){
recievedRequestsTask.cancel(true);
}
}
}
Adapter:
public class RecievedRequestsAdapter extends BaseAdapter {
private LayoutInflater inflater;
private List<GetEventRequest> list;
public RecievedRequestsAdapter(Context ctx, List<GetEventRequest> list){
this.list = list;
inflater = LayoutInflater.from(ctx); //This is where null pointer happens
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView == null){
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.result_list_adapter, parent, false);
holder.txtTitle = (TextView) convertView.findViewById(R.id.txtTitle);
holder.txtDesc = (TextView) convertView.findViewById(R.id.txtDescription);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
//Do stuff, set views, etc
return convertView;
}
private static final class ViewHolder{
public TextView txtTitle, txtDesc;
}
}
Anyone has any ideas? It's very difficult to test or debug this because it happens so randomly and only after extended period of application sitting idly in the background.
A fragment's getActivity()
returns null
if the fragment is not attached to an activity.
Your async task listener onEventsAvailable()
is not bound to the fragment lifecycle and it can fire also when the fragment is detached.
Consider redesigning your code so that a fragment that is not displaying does not need to update itself.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.