2013-12-22 3 views
1

я сталкиваюсь с ситуацией, что первый URL на изображение должно быть получить от API Weibo, а затем, я хочу показать изображение, основанное на URL:Android Volley: зерноуборочный JsonObjectRequest & ImageLoader, NullPointerException

залпа Lib используется здесь, и вот мой код:

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 при использовании в weiboUrl для последнего sentense:

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

Я знаю, что это происходит потому, что т hat Volley создаст другой Thread, поэтому я не должен использовать ссылку в основном потоке до окончания 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 кэш поддержки для чтения изображений, мне действительно нужны решения для чтения кеша.

Спасибо.

Смежные вопросы