Attempt to invoke virtual method 'android.content.Context android.support.v4.app.FragmentActivity.getApplicationContext()' on a null object reference

18,890

The reason is because when you call getActivity() in the onPostExecute(), the Fragment is already detached from the Activity (for example, when the AsyncTask is executing, user click back button to exit the activity), so getActivity() would be null.

The solution is before getActivity(), check isAdded() is true or not, if not true, that means the fragment is already detached, call to getActivity() will return null.

Remember in the AsyncTask, everywhere before you call getActivity(), you'd better to check isAdded() again, because user may exit the activity at anytime during the AsyncTask is executing.

Share:
18,890
Akshay Shah
Author by

Akshay Shah

Small Developer workin for a big company

Updated on June 14, 2022

Comments

  • Akshay Shah
    Akshay Shah almost 2 years

    Following is my code for my fragment, i get the above error of null exception

     /**
      * Created by USer on 09-04-2016.
      */
     public class FeaturedFragment extends android.support.v4.app.Fragment {
         private List url;
         private SliderLayout sliderLayout;
         private GridView gridView;
         private int firstVisiblepos;
         AppnextAPI api;
    
         @Nullable
         @Override
         public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
             View rootView = inflater.inflate(
                     R.layout.featured, container, false);
             url = new ArrayList<String>();
             url.add("http://192.168.5.51/Wallpapers/Autumn.jpg");
             url.add("http://192.168.5.51/Wallpapers/Tree.jpg");
             url.add("http://192.168.5.51/Wallpapers/Flower.jpg");
             url.add("http://192.168.5.51/Wallpapers/Lion.jpg");
             api = new AppnextAPI(getActivity(), "my id");
             sliderLayout = (SliderLayout) rootView.findViewById(R.id.slider);
             gridView = (GridView) rootView.findViewById(R.id.gridView);
             ThemeShowcase theme = new ThemeShowcase();
             theme.execute("getThemes");
             for (int i = 0; i < url.size(); i++) {
                 TextSliderView textSliderView = new TextSliderView(getActivity().getApplicationContext());
                 textSliderView.image((String) url.get(i));
                 sliderLayout.addSlider(textSliderView);
             }
             sliderLayout.setDuration(4000);
             sliderLayout.setPresetTransformer(SliderLayout.Transformer.Stack);
             return rootView;
         }
    
    
         private class ThemeShowcase extends AsyncTask<String, Integer, ArrayList<ThemeModel>> {
    
             private final String NAMESPACE = "http://tempuri.org/";
             private final String URL = "http://192.168.5.51/WebApplication/WebService.asmx";
             private final String SOAP_ACTION = "http://tempuri.org/";
             private String responseString;
             private ArrayList model = null;
             private ThemeModel dummy;
    
             @Override
             protected void onPreExecute() {
                 super.onPreExecute();
                 model = new ArrayList<ThemeModel>();
             }
    
             @Override
             protected ArrayList<ThemeModel> doInBackground(String... params) {
                 try {
                     SoapObject request = new SoapObject(NAMESPACE, params[0]);
                     PropertyInfo sayHelloPI = new PropertyInfo();
                     sayHelloPI.setName("page");
                     sayHelloPI.setValue("1");
                     sayHelloPI.setType(Integer.class);
                     request.addProperty(sayHelloPI);
                     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                             SoapEnvelope.VER11);
                     envelope.dotNet = true;
                     envelope.setOutputSoapObject(request);
                     HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
                         androidHttpTransport.call(SOAP_ACTION + params[0], envelope);
                         SoapPrimitive response = (SoapPrimitive) envelope.getResponse();
                         responseString = response.toString();
                     if (!responseString.equalsIgnoreCase("Error occured")) {
                         JSONArray array = new JSONArray(responseString);
                         for (int i = 0; i < array.length(); i++) {
                             JSONObject objct = array.getJSONObject(i);
                             dummy = new ThemeModel();
                             dummy.preview = objct.getString("Preview");
                             dummy.name = objct.getString("Name");
                             model.add(dummy);
                         }
                     }
    
                 } catch (Exception e) {
                     model = null;
                     return model;
                 }
                 return model;
             }
    
             @Override
             protected void onPostExecute(ArrayList<ThemeModel> model) {
                 if(model!=null) {
                     gridView.setAdapter(new ImageAdapter(getActivity().getApplicationContext(), model));
                     firstVisiblepos = gridView.getFirstVisiblePosition();
                 }else{
                     try {
                         Toast.makeText(getActivity().getApplicationContext(), "Site Unreachable", Toast.LENGTH_LONG).show();
                     }catch (Exception e){
                         Log.d("MyApp","exception");
                     }
                 }
             }
         }
     }
    

    here's my image adapter

     public class ImageAdapter extends BaseAdapter implements View.OnClickListener{
    
         private Context context;
         private LayoutInflater inflater;
         private ArrayList<ThemeModel> model;
         public ImageAdapter(Context context,ArrayList<ThemeModel> model) {
             this.inflater = LayoutInflater.from(context);
             this.context = context;
             this.model = model;
    
         }
    
         @Override
         public int getCount() {
             return model.size();
         }
    
         @Override
         public Object getItem(int position) {
             return null;
         }
    
         @Override
         public long getItemId(int position) {
             return 0;
         }
    
         @Override
         public View getView(int position, View convertView, ViewGroup parent) {
             convertView = inflater.inflate(R.layout.custom_item,null);
             CardView cardView = (CardView)convertView.findViewById(R.id.cardView);
             cardView.setOnClickListener(this);
             ImageView imageView = (ImageView)convertView.findViewById(R.id.imageView);
             final ProgressBar progressBar = (ProgressBar)convertView.findViewById(R.id.progressbar);
             TextView textView = (TextView)convertView.findViewById(R.id.contentName);
             ImageButton imageButton = (ImageButton)convertView.findViewById(R.id.downloadButton);
             textView.setText(model.get(position).getName());
             Picasso.with(context).load(model.get(position).getPreview()).into(imageView, new Callback() {
                 @Override
                 public void onSuccess() {
                     progressBar.setVisibility(View.GONE);
                 }
    
                 @Override
                 public void onError() {
    
                 }
             });
             return convertView;
         }
    
         @Override
         public void onClick(View v) {
    
         }
     }
    

    i keep getting force close on below line

    gridView.setAdapter(new ImageAdapter(getActivity().getApplicationContext(), model));
    

    the error is

    java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.support.v4.app.FragmentActivity.getApplicationContext()' on a null object reference
    

    i have tried using getActivity(),getContext() etc but none of them work

  • Fred van Rijswijk
    Fred van Rijswijk over 6 years
    Saved my day: "Remember in the AsyncTask, everywhere before you call getActivity(), you'd better to check isAdded() again, because user may exit the activity at anytime during the AsyncTask is executing."