2

以下は私のコードです。null例外の上記のエラーが表示されますnullオブジェクト参照で仮想メソッド 'android.content.Context android.support.v4.app.FragmentActivity.getApplicationContext()'を呼び出そうとしました

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

エラーが

+1

try getActivity() 'のみ –

+0

私はそれも試しましたが成功しませんでした –

+0

doInIngroundはどのくらいの時間をかけてタスクを完了できますか? –

答えて

6

に理由を動作し、私はそれらのgetActivity()、のgetContext()などが、どれを使って試してみました

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

であるあなたがonPostExecute()getActivity()を呼び出すとき、Fragmentは既にから切り離されているためでありますActivity(たとえば、AsyncTaskが実行されている場合、ユーザーはアクティビティを終了するために戻るボタンをクリックします)、getActivity()はnullになります。

解決策は、isAdded()が真であるかどうかをチェックします。真でない場合は、フラグメントが既に切り離されていることを意味します。getActivity()はnullを返します。

getActivity()を呼び出す前にどこでもAsyncTaskを覚えておいてください。ユーザーはAsyncTaskの実行中にいつでもアクティビティを終了できるので、isAdded()を再度チェックすることをお勧めします。

+0

私の日を保存しました。 "getActivity AsyncTaskが実行されている間はいつでもユーザーがアクティビティを終了できるので、isAdded()を再度チェックすることをお勧めします。 –

関連する問題