2014-02-14 42 views
1

我有一个加载项目列表视图的异步任务。我目前正试图设置onClick来加载一个新的片段与“ID”,是从被点击的列表项中检索。 Android Studio显示我的代码中没有错误。使用asyncTask,接口和片段时出现NullPointerException

当我运行的应用程序,并在列表视图中单击项目我得到这个FC:

02-13 19:49:56.813 20334-20334/com.beerportfolio.beerportfoliopro E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    java.lang.NullPointerException 
      at com.beerportfolio.beerportfoliopro.ReadJSONResult$1.onItemClick(ReadJSONResult.java:140) 
      at android.widget.AdapterView.performItemClick(AdapterView.java:298) 
      at android.widget.AbsListView.performItemClick(AbsListView.java:1237) 
      at android.widget.ListView.performItemClick(ListView.java:4555) 
      at android.widget.AbsListView$PerformClick.run(AbsListView.java:3037) 
      at android.widget.AbsListView$1.run(AbsListView.java:3724) 
      at android.os.Handler.handleCallback(Handler.java:730) 
      at android.os.Handler.dispatchMessage(Handler.java:92) 
      at android.os.Looper.loop(Looper.java:158) 
      at android.app.ActivityThread.main(ActivityThread.java:5789) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:525) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:843) 
      at dalvik.system.NativeStart.main(Native Method) 
02-13 19:50:42.112 20864-20870/? E/jdwp﹕ Failed sending reply to debugger: Broken pipe 

线140 ReadJSONResult是:

listenerBeer.onArticleSelected(idToSend); 

这条线是这个整体的一部分的onClick:

//set up clicks 
       lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
        @Override 
        public void onItemClick(AdapterView<?> arg0, View arg1, 
              int arg2, long arg3) { 
         BeerData beerInfo = beerList.get(arg2); 

         String idToSend = beerInfo.beerId; 

         //todo: launch beer fragment 
         listenerBeer.onArticleSelected(idToSend); 




        } 
       }); 

所有ReadJSONResult代码:

public class ReadJSONResult extends AsyncTask<String, Void, String> { 

     Context c; 
     private ProgressDialog Dialog; 

     public ReadJSONResult(Context context) 
     { 
      c = context; 
      Dialog = new ProgressDialog(c); 
     } 

     //code for on click 
     OnArticleSelectedListener listenerBeer; 
     public interface OnArticleSelectedListener{ 
      public void onArticleSelected(String myString); 


     } 
    public void setOnArticleSelectedListener(OnArticleSelectedListener listener){ 
     this.listenerBeer = listener; 


    } 
    //end code for onClick 

     @Override 
     protected String doInBackground(String... arg0) { 
      // TODO Auto-generated method stub 
      return readJSONFeed(arg0[0]); 
     } 

     protected void onPreExecute() { 
      Dialog.setMessage("Searching Beer Cellar"); 

      Dialog.setTitle("Loading"); 
      Dialog.setCancelable(false); 
      Dialog.show(); 
     } 

     protected void onPostExecute(String result){ 
      //decode json here 
      try{ 

       JSONObject json = new JSONObject(result); 

       //acces listview 
       ListView lv = (ListView) ((Activity) c).findViewById(android.R.id.list); 


       //make array list for beer 
       final List<BeerData> beerList = new ArrayList<BeerData>(); 



       //get json items 
       for(int i = 0; i < json.getJSONArray("data").length(); i++) { 

        String beerId = GetBeerDataFromJSON(i,"id", json); 
        String beerName = GetBeerDataFromJSON(i,"name", json); 
        String beerDescription = GetBeerDataFromJSON(i,"description" , json); 
        String beerAbv = GetBeerDataFromJSON(i,"abv" , json); 
        String beerIbu = GetBeerDataFromJSON(i,"ibu" , json); 
        String beerIcon = GetBeerIconsFromJSON(i, "icon",json); 
        String beerMediumIcon = GetBeerIconsFromJSON(i, "medium",json); 
        String beerLargeIcon = GetBeerIconsFromJSON(i, "large",json); 
        String beerGlass = GetBeerGlassFromJSON(i, json); 
        String beerStyle = GetBeerStyleFromJSON(i,"name", json); 
        String beerStyleDescription = GetBeerStyleFromJSON(i,"description", json); 
        String beerBreweryId = GetBeerBreweryInfoFromJSON(i, "id", json); 
        String beerBreweryName = GetBeerBreweryInfoFromJSON(i, "name", json); 
        String beerBreweryDescription = GetBeerBreweryInfoFromJSON(i, "description", json); 
        String beerBreweryWebsite = GetBeerBreweryInfoFromJSON(i, "website", json); 

        //get long and latt 
        String beerBreweryLat = GetBeerBreweryLocationJSON(i, "longitude", json); 
        String beerBreweryLong = GetBeerBreweryLocationJSON(i, "latitude", json); 

        String beerBreweryYear = GetBeerBreweryInfoFromJSON(i, "established", json); 
        String beerBreweryIcon = GetBeerBreweryIconsFromJSON(i,"large",json); 



        //create beer object 
        BeerData thisBeer = new BeerData(beerName, beerId, beerDescription, beerAbv, beerIbu, beerIcon, 
          beerMediumIcon,beerLargeIcon, beerGlass, beerStyle, beerStyleDescription, beerBreweryId, beerBreweryName, 
          beerBreweryDescription, beerBreweryYear, beerBreweryWebsite,beerBreweryIcon, beerBreweryLat, beerBreweryLong); 

        //add beer to list 
        beerList.add(thisBeer); 


       } 

       //update listview 
       BeerSearchAdapter adapter1 = new BeerSearchAdapter(c ,R.layout.listview_item_row, beerList); 
       lv.setAdapter(adapter1); 

       //set up clicks 
       lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
        @Override 
        public void onItemClick(AdapterView<?> arg0, View arg1, 
              int arg2, long arg3) { 
         BeerData beerInfo = beerList.get(arg2); 

         String idToSend = beerInfo.beerId; 

         //todo: launch beer fragment 
         listenerBeer.onArticleSelected(idToSend); 




        } 
       }); 




      } 
      catch(Exception e){ 

      } 

      Dialog.dismiss(); 

     } 

     //todo: all the get functions go here 
     private String GetBeerDataFromJSON(int position, String whatToGet, JSONObject json) { 
      String whatIsTheKeyYouAreLookFor = whatToGet; 
      int whereInTheJSONArrayForLoopIsTheData = position; 
      String holder = ""; 
      try{ 
       holder = json.getJSONArray("data").getJSONObject(whereInTheJSONArrayForLoopIsTheData).getString(whatIsTheKeyYouAreLookFor); 

      } catch (JSONException e) { 
       holder = "N/A"; 
      } 



      return holder; 
     } 


     //get icons 
     private String GetBeerBreweryIconsFromJSON(int position, String whatToGet, JSONObject json) { 
      String whatIsTheKeyYouAreLookFor = whatToGet; 
      int whereInTheJSONArrayForLoopIsTheData = position; 
      String holder = ""; 
      try{ 
       holder = json.getJSONArray("data").getJSONObject(whereInTheJSONArrayForLoopIsTheData).getJSONArray("breweries").getJSONObject(0).getJSONObject("images").getString(whatIsTheKeyYouAreLookFor);; 
      } catch (JSONException e) { 
       holder = "N/A"; 
      } 



      return holder; 
     } 

     //get icons 
     private String GetBeerIconsFromJSON(int position, String whatToGet, JSONObject json) { 
      String whatIsTheKeyYouAreLookFor = whatToGet; 
      int whereInTheJSONArrayForLoopIsTheData = position; 
      String holder = ""; 
      try{ 
       holder = json.getJSONArray("data").getJSONObject(whereInTheJSONArrayForLoopIsTheData).getJSONObject("labels").getString(whatIsTheKeyYouAreLookFor); 

      } catch (JSONException e) { 
       holder = "N/A"; 
      } 



      return holder; 
     } 

     //get style information 
     private String GetBeerStyleFromJSON(int position, String whatToGet, JSONObject json) { 
      String whatIsTheKeyYouAreLookFor = whatToGet; 
      int whereInTheJSONArrayForLoopIsTheData = position; 
      String holder = ""; 
      try{ 
       holder = json.getJSONArray("data").getJSONObject(whereInTheJSONArrayForLoopIsTheData).getJSONObject("style").getString(whatIsTheKeyYouAreLookFor); 

      } catch (JSONException e) { 
       holder = "N/A"; 
      } 



      return holder; 
     } 

     //get location data 
     private String GetBeerBreweryLocationJSON(int position, String whatToGet, JSONObject json) { 
      String whatIsTheKeyYouAreLookFor = whatToGet; 
      int whereInTheJSONArrayForLoopIsTheData = position; 
      String holder = ""; 
      try{ 
       holder = json.getJSONArray("data").getJSONObject(whereInTheJSONArrayForLoopIsTheData).getJSONArray("breweries").getJSONObject(0).getJSONArray("locations").getJSONObject(0).getString(whatIsTheKeyYouAreLookFor); 

      } catch (JSONException e) { 
       holder = "N/A"; 
      } 



      return holder; 
     } 

     //get brewery information 
     //get style information 
     private String GetBeerBreweryInfoFromJSON(int position, String whatToGet, JSONObject json) { 
      String whatIsTheKeyYouAreLookFor = whatToGet; 
      int whereInTheJSONArrayForLoopIsTheData = position; 
      String holder = ""; 
      try{ 
       holder = json.getJSONArray("data").getJSONObject(whereInTheJSONArrayForLoopIsTheData).getJSONArray("breweries").getJSONObject(0).getString(whatIsTheKeyYouAreLookFor); 

      } catch (JSONException e) { 
       holder = "N/A"; 
      } 



      return holder; 
     } 

     //get glass 
     private String GetBeerGlassFromJSON(int position, JSONObject json) { 

      int whereInTheJSONArrayForLoopIsTheData = position; 
      String holder = ""; 
      try{ 
       holder = json.getJSONArray("data").getJSONObject(whereInTheJSONArrayForLoopIsTheData).getJSONObject("glass").getString("name"); 

      } catch (JSONException e) { 
       holder = "N/A"; 
      } 



      return holder; 
     } 



     public String readJSONFeed(String URL) { 
      StringBuilder stringBuilder = new StringBuilder(); 
      HttpClient httpClient = new DefaultHttpClient(); 
      HttpGet httpGet = new HttpGet(URL); 
      try { 
       HttpResponse response = httpClient.execute(httpGet); 
       StatusLine statusLine = response.getStatusLine(); 
       int statusCode = statusLine.getStatusCode(); 
       if (statusCode == 200) { 
        HttpEntity entity = response.getEntity(); 
        InputStream inputStream = entity.getContent(); 
        BufferedReader reader = new BufferedReader(
          new InputStreamReader(inputStream)); 
        String line; 
        while ((line = reader.readLine()) != null) { 
         stringBuilder.append(line); 
        } 
        inputStream.close(); 
       } else { 
        Log.d("JSON", "Failed to download file"); 
       } 
      } catch (Exception e) { 
       Log.d("readJSONFeed", e.getLocalizedMessage()); 
      } 
      return stringBuilder.toString(); 
     } 

    } 

BeerSearchAdapter是:

public class BeerSearchAdapter extends ArrayAdapter<BeerData> { 

    Context context; 
    int layoutResourceId; 
    List<BeerData> data = null; 

    public BeerSearchAdapter(Context context, int layoutResourceId, List<BeerData> data) { 
     super(context, layoutResourceId, data); 
     this.layoutResourceId = layoutResourceId; 
     this.context = context; 
     this.data = data; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     beerHolder holder = null; 

     if(row == null) 
     { 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 

      holder = new beerHolder(); 
      holder.txtBrewery = (TextView)row.findViewById(R.id.beerBreweryNameList); 
      holder.txtTitle = (TextView)row.findViewById(R.id.beerNameList); 

      row.setTag(holder); 
     } 
     else 
     { 
      holder = (beerHolder)row.getTag(); 
     } 

     BeerData beer = data.get(position); 
     holder.txtTitle.setText(beer.beerName); 
     holder.txtBrewery.setText(beer.beerBreweryName); 

     return row; 
    } 

    static class beerHolder 
    { 
     TextView txtBrewery; 
     TextView txtTitle; 
    } 
} 

我Search.java在接口配备形式是在这里:

public class Search extends Fragment implements SearchView.OnQueryTextListener, ReadJSONResult.OnArticleSelectedListener { 

    private ListView lv; 
    View v; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     //set layout here 
     v = inflater.inflate(R.layout.activity_search, container, false); 
     setHasOptionsMenu(true); 
     getActivity().setTitle("Search"); 


     //get user information 
     SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); 
     String userName = prefs.getString("userName", null); 
     String userID = prefs.getString("userID", null); 


     //todo: code body goes here 





     // Inflate the layout for this fragment 
     return v; 


} 


    @Override 
    public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) { 
     // Inflate the menu; this adds items to the action bar if it is present. 

     super.onCreateOptionsMenu(menu, inflater); 

     Log.d("click", "inside the on create"); 

     //inflater.inflate(R.menu.main, menu); 
     SearchView searchView = (SearchView) menu.findItem(R.id.menu_search2).getActionView(); 
     searchView.setIconified(false); 
     searchView.setOnQueryTextListener(this); 
    } 




    public boolean onQueryTextSubmit (String query) { 

     //toast query 

     //make json variables to fill 

     // url to make request 
     String url = "myURL"; 



     try { 
      query = URLEncoder.encode(query, "UTF-8"); 
     } catch (UnsupportedEncodingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


     String jsonUrl = url + query; 



     //todo: get json 
     new ReadJSONResult(getActivity()).execute(jsonUrl); 

     return false; 
    } 





    @Override 
    public boolean onQueryTextChange(String newText) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public void onArticleSelected(String b){ 

     //code to execute on click 
     Fragment Fragment_one; 
     FragmentManager man= getFragmentManager(); 
     FragmentTransaction tran = man.beginTransaction(); 

     //todo: set to beer fragment 
     Fragment_one = new StylePage2(); 
     final Bundle bundle = new Bundle(); 
     bundle.putString("beerIDSent", b); 
     Fragment_one.setArguments(bundle); 
     tran.replace(R.id.main, Fragment_one);//tran. 
     tran.addToBackStack(null); 
     tran.commit(); 

    } 



} 

让我知道如果你需要任何其他代码,我踩在这并可以使用第二双眼睛。谢谢。

回答

5

从错误消息可知,listenerBeer的引用是null

我看到这个代码:

public void setOnArticleSelectedListener(OnArticleSelectedListener listener){ 
    this.listenerBeer = listener; 
} 

,但我没有看到调用它的任何代码。除非有没有包含的代码可以设置listenerBeer参考,否则这将解释为什么它是null

某处在你的代码,你将不得不做这样的事情:

. . . 
setOnArticleSelectedListener(new OnArticleSelectedListener() { 
    public void onArticleSelected(String myArticle) { 
    // Do something here.... 
    } 
}); 
. . . 

HTH

+0

ist this line called it:listenerBeer.onArticleSelected(idToSend); – Mike

+0

不,这是导致问题的线路。某处你必须通过调用'setOnArticleSelectedListener(...);'来设置侦听器,但我没有看到那个代码。 –

1

你已完成了纠正,在下面的调用onArticleSelected您listenerBeer为空。

listenerBeer.onArticleSelected(idToSend); 

其背后的唯一可能的原因是,它是不是在进行此调用之前initiallized。从您的代码中可以看出,您正在进行初始化的唯一位置在以下方法中。

public void setOnArticleSelectedListener(OnArticleSelectedListener listener){ 
    this.listenerBeer = listener; 
} 

但是,我看不到这个的任何实现。你可以在listenerBeer.onArticleSelected(idToSend)之前做一个空检查;并验证listenerBeer是否初始化如

if (null != listenerBeer){ 
    listenerBeer.onArticleSelected(idToSend); 
}else{ 
    Log.d("Null Check", "ListenereBeer is " + String.valueOf(listenerBeer)); 
} 
+0

非常原始的答案 –

+0

@JStevenPerry并不想要拥有相同的东西。没有冒犯,但我没有复制。输入的答案相同,但速度更快。所有学分给你。 +1从我身边。 :) –

+1

不用担心。我相信你,但是在这个网站上发生了很多事情。我会发布一个答案,5分钟后有人采取我的答案,稍微修改它,它会被接受和upvoted! –

相关问题