尝试在空对象引用上调用虚拟方法'android.content.Context android.support.v4.app.FragmentActivity.getApplicationContext()' [英] Attempt to invoke virtual method 'android.content.Context android.support.v4.app.FragmentActivity.getApplicationContext()' on a null object reference

查看:131
本文介绍了尝试在空对象引用上调用虚拟方法'android.content.Context android.support.v4.app.FragmentActivity.getApplicationContext()'的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下是我的代码片段,我收到了上面的null异常错误

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");
                 }
             }
         }
     }
 }

这是我的图像适配器

 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));

错误是

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

我尝试使用getActivity(),getContext()等,但它们都不起作用

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

推荐答案

原因是因为当您在onPostExecute()中调用getActivity()时,Fragment已经与Activity分离(例如,当AsyncTask正在执行,用户单击后退"按钮退出活动),因此getActivity()将为空.

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.

解决方案在getActivity()之前,请检查isAdded()是否正确,如果不正确,则意味着片段已分离,调用getActivity()将返回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.

请记住在AsyncTask中的任何地方,在调用getActivity()之前,最好再次检查isAdded(),因为用户可以在AsyncTask执行期间随时退出活动.

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.

这篇关于尝试在空对象引用上调用虚拟方法'android.content.Context android.support.v4.app.FragmentActivity.getApplicationContext()'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆