以下是我的片段代码,我得到了以上的null异常错误
/**
* 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) {
}
}
我继续强行关闭下线
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()等但没有一个工作
答案 0 :(得分:7)
原因是当您在getActivity()
中调用onPostExecute()
时,Fragment
已经与Activity
分离(例如,当AsyncTask正在执行时,用户单击后退按钮退出活动),因此getActivity()
将为空。
解决方案在getActivity()
之前,检查isAdded()
是否为真,如果不是,则表示该片段已经分离,对getActivity()
的调用将返回null。
请记住在AsyncTask中,在您致电getActivity()
之前的任何地方,您最好再次检查isAdded()
,因为用户可能会在执行AsyncTask期间的任何时候退出活动。