尝试在空对象引用上调用虚拟方法'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
问题描述
以下是我的代码片段,我收到了上面的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屋!