2013-12-22 20 views
1

我遇到第一個圖片的網址應該是從微博的API獲取的情況,然後,我想告訴基於URL的圖像:Android的凌空:聯合JsonObjectRequest&ImageLoader的,NullPointerException異常

凌空庫使用在這裏,這裏是我的代碼:

JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 
        Log.i("Result", response.toString()); 
        try { 
         String weiboNickName = response.getString("name"); 
         weiboNameMain.setText(weiboNickName); 

         weiboUrl = response.getString("avatar_hd"); 

         weiboUrl = weiboUrl.replace("\\", ""); 

         Toast.makeText(MainPage.this, "url: " + weiboUrl, Toast.LENGTH_SHORT).show();              imageLoader = new ImageLoader(queue, new BitmapLruCache(BitmapLruCache.getDefaultLruCacheSize())); 

        } catch (JSONException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 
      }, new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
       } 
      }); 
      queue.add(jsObjRequest); 
      imageLoader.get(weiboUrl,ImageLoader.getImageListener(weiboAvatarMain,R.drawable.user, R.drawable.user)); 

不過,我會得到一個NullPointerException異常時使用的最後一個sentense weiboUrl:

 imageLoader.get(weiboUrl,ImageLoader.getImageListener(weiboAvatarMain,R.drawable.user, R.drawable.user)); 

我知道這是因爲ŧ帽子Volley將創建另一個線程,所以我不應該在Thread in Request結束之前使用主線程中的引用。

是否有一些想法可以用來解決這個問題?

在此先感謝。

最佳

---更新

的問題是,我把

imageLoader.get(weiboUrl,ImageLoader.getImageListener(weiboAvatarMain,R.drawable.user, R.drawable.user)); 

在錯誤的位置。如果我把它放在jsObject的onResponse()方法中,問題就會消失。然後可以使用圖像緩存。 (ImageRequest沒有自己的緩存機制本身)

回答

0
JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 
        Log.i("Result", response.toString()); 
        try { 
         String weiboNickName = response.getString("name"); 
         weiboNameMain.setText(weiboNickName); 

         weiboUrl = response.getString("avatar_hd"); 

         weiboUrl = weiboUrl.replace("\\", ""); 


         Response.Listener<Bitmap> listener = new Response.Listener<Bitmap>() { 
          @Override 
          public void onResponse(Bitmap bitmap) { 
           String weiboAvatar = ImageHandler.storeImage(bitmap, getRoot(), getWeiboAvatarName()); 

           Log.i("store info", weiboAvatar); 
           Editor edit = preference.edit(); 
           edit.putString("weiboAvatar", weiboAvatar); 
           edit.apply(); 

           weiboAvatarMain.setImageBitmap(bitmap); 
          } 
         }; 

         ImageRequest imgRequest = new ImageRequest(weiboUrl, listener, 0, 0, null, null); 
         queue.add(imgRequest); 
        } catch (JSONException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 
      }, new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
       } 
      }); 
      queue.add(jsObjRequest); 

我用的ImageRequest代替ImageLoader來解決這個問題,它的工作原理。這裏的場景是圖像不會超時變化,所以我將它保存到本地文件中。

但是,由於ImageLoader支持緩存圖像讀取,我真的需要緩存讀取的解決方案。

謝謝。

相關問題