Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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

like image 363
Akshay Shah Avatar asked Apr 14 '16 07:04

Akshay Shah


1 Answers

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.

like image 99
Weidian Huang Avatar answered Jan 20 '23 03:01

Weidian Huang