2012-12-21 3 views
-1

날씨 피드에서 JSON 응답을 파싱 중이며받은 데이터에 조건과 일치하는 아이콘이있는 URL이 포함 된 경우 ImageView에 해당 아이콘이 표시됩니다. 내 프로젝트에 코드 패키지를 이동하기 전에 샌드 박스 응용 프로그램에서이 작업을 수행 할 수있었습니다. 주요 프로젝트에서 ImageLoader 오프 스크린, SlidingMenu 항목에 대한 NullPointerException?

나는 탐색 ActionBarSherlockSlidingMenu의 최신 버전을 사용, 두 앱 모두는 Android-Async-Http-Client을 활용하지만 지금은 이미지 뷰에서 해당 URL의 아이콘을 표시하려고 치명적인 NullPointerException가 있습니다. 나는 이것이 어떤 도서관에 의해 야기 된 것이라고 생각하지 않는다.

나는 슬라이딩 메뉴가 주로 슬라이딩 메뉴의 일부에서 수행하는 Adapter로 처리되는 ListView 유형으로 구성되어있는 것을 보아 왔습니다. 하지만 내가 가진 유일한 실마리는 그것이 작동하려고하는 오프 스크린 UI 요소이기 때문에 충돌한다는 것입니다. 어댑터에 의해 처리되지 않는 슬라이딩 메뉴에 뭔가있는 것이 중요합니까? 나는 다른 것들이 다르다는 것을 상상할 수는 없지만 당신이 누락 된 것에 대해 어떤 단서를 가지고 있는지도 모릅니다. 다행히도 내가 잊어 버리고있는 것은 기본이 아니거나 ... 어쩌면 :)

아무튼, 고마워.

wireframe

public class MainActivity extends SlidingActivity implements 
     ActionBar.OnNavigationListener { 
    final String TAG = "MainActivity"; 
    private TextView mSelected; 
    private String[] mLocations; 
    ImageLoader imageLoader; 
    ImageView weatherIcon; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     imageLoader = new ImageLoader(this); 

     wireViews(); 

     getWeatherFeed(); 

     Context context = getSupportActionBar().getThemedContext(); 
     ArrayAdapter<CharSequence> list = ArrayAdapter.createFromResource(
       context, R.array.activities, R.layout.sherlock_spinner_item); 
     list.setDropDownViewResource(R.layout.sherlock_spinner_dropdown_item); 

     getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 
     getSupportActionBar().setListNavigationCallbacks(list, this); 
     getSupportActionBar().setDisplayShowTitleEnabled(false); 

     // set the Behind View 
     setBehindContentView(R.layout.menu_frame); 

     // SlidingMenu 
     SlidingMenu sm = getSlidingMenu(); 
     sm.setShadowWidthRes(R.dimen.shadow_width); 
     sm.setShadowDrawable(R.drawable.shadow); 
     sm.setBehindOffsetRes(R.dimen.slidingmenu_offset); 
     sm.setFadeDegree(0.35f); 
     sm.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN); 

     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     setSlidingActionBarEnabled(false); 

     ListView menuList = (ListView) findViewById(R.id.menuList); 
     SlidingMenuItem[] data = new SlidingMenuItem[] { 
       new SlidingMenuItem("Item1 Label", "Item1 Sub-label",getResources().getDrawable(R.drawable.item1)), 
       new SlidingMenuItem("Item2 Label", "Item2 Sub-Label",getResources().getDrawable(R.drawable.item2)) }; 

     MenuAdapter adapter = new MenuAdapter(this, R.layout.sliding_menu_item, 
       data); 
     menuList.setAdapter(adapter); 
    } 

    private void updateWeatherUi(String degreeText, String descriptionText, 
      String iconUrl) { 
     Log.i(TAG, "Updating UI elements..."); 

     if (imageLoader != null) { 
      Log.i(TAG, "IMAGE_LOADER NOT NULL!!!"); 
     } 
     imageLoader.DisplayImage(iconUrl, weatherIcon); // FIXME: FATAL CRASH HERE !!! 
    } 

    /** Build a Weather object from the JSON response. 
    * @throws JSONException */ 
    private void buildWeatherObject(String rawResponse) throws JSONException { 
     Log.i(TAG, "Building Weather ojbect..."); 

     JSONObject baseObject = new JSONObject(rawResponse); 
     JSONObject data = new JSONObject(baseObject.getString(Key.DATA)); 

     JSONArray conditionArray = new JSONArray(
       data.getString(Key.CURRENT_CONDITION)); 

     for (int i = 0; i < conditionArray.length(); i++) { 
      JSONObject conditionElement = new JSONObject(
        conditionArray.getString(i)); 
      weather = new Weather(); 
      weather.tempMaxF = conditionElement.getString(Key.TEMP_F); 

      JSONArray weatherDescriptionArray = new JSONArray(
        conditionElement.getString(Key.W_WEATHER_DESC)); 
      for (int j = 0; j < weatherDescriptionArray.length(); j++) { 
       JSONObject weatherDescriptionElement = new JSONObject(
         weatherDescriptionArray.getString(j)); 
       weather.weatherDesc = weatherDescriptionElement 
         .getString(Key.VALUE); 
      } 

      JSONArray weatherIconArray = new JSONArray(
        conditionElement.getString(Key.WEATHER_ICON_URL)); 
      for (int j = 0; j < weatherIconArray.length(); j++) { 
       JSONObject weatherIconElement = new JSONObject(
         weatherIconArray.getString(j)); 
       weather.weatherIconUrl = weatherIconElement 
         .getString(Key.VALUE); 
       Log.i(TAG, weather.weatherIconUrl); 
      } 
      conditionElement = null; 

      updateWeatherUi(weather.tempMaxF, weather.weatherDesc, 
        weather.weatherIconUrl); 
     } 
    } 

    /** Asynchronously request and receive weather feed data. */ 
    private void getWeatherFeed() { 
     Log.i(TAG, "Getting asynchronous JSON feed..."); 

     AsyncHttpClient client = new AsyncHttpClient(); 
     client.get(WEATHER_FEED_URL, new AsyncHttpResponseHandler() { 
      @Override 
      public void onSuccess(String response) { 
       try { 
        buildWeatherObject(response); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 

      @Override 
      public void onFailure(Throwable arg0, String arg1) { 
       super.onFailure(arg0, arg1); 
       showToast("Sorry, the weather forecast wasn't available just then."); 
      } 
     }); 
    } 

    private void wireViews() { 
     Log.i(TAG, "Wiring UI elements..."); 
     mSelected = (TextView) findViewById(R.id.text); 
     mLocations = getResources().getStringArray(R.array.activities); 
     weatherIcon = (ImageView) findViewById(R.id.weatherIconView); 
    } 

12-21 01:01:11.130: I/MainActivity(28502): Building Weather ojbect... 
12-21 01:01:11.170: I/MainActivity(28502): http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0001_sunny.png 
12-21 01:01:11.170: I/MainActivity(28502): Updating UI elements... 
12-21 01:01:11.170: I/MainActivity(28502): IMAGE_LOADER NOT NULL!!! 
12-21 01:01:11.170: D/AndroidRuntime(28502): Shutting down VM 
12-21 01:01:11.170: W/dalvikvm(28502): threadid=1: thread exiting with uncaught exception (group=0x4001d5a0) 
12-21 01:01:11.180: E/AndroidRuntime(28502): FATAL EXCEPTION: main 
12-21 01:01:11.180: E/AndroidRuntime(28502): java.lang.NullPointerException 
12-21 01:01:11.180: E/AndroidRuntime(28502): at com.eric.app.networkxml.ImageLoader.DisplayImage(ImageLoader.java:42) 
12-21 01:01:11.180: E/AndroidRuntime(28502): at com.eric.app.MainActivity.updateWeatherUi(MainActivity.java:129) 
12-21 01:01:11.180: E/AndroidRuntime(28502): at com.eric.app.MainActivity.buildWeatherObject(MainActivity.java:172) 
12-21 01:01:11.180: E/AndroidRuntime(28502): at com.eric.app.MainActivity.access$0(MainActivity.java:137) 
12-21 01:01:11.180: E/AndroidRuntime(28502): at com.eric.app.MainActivity$1.onSuccess(MainActivity.java:195) 
12-21 01:01:11.180: E/AndroidRuntime(28502): at com.loopj.android.http.AsyncHttpResponseHandler.handleSuccessMessage(AsyncHttpResponseHandler.java:160) 
12-21 01:01:11.180: E/AndroidRuntime(28502): at com.loopj.android.http.AsyncHttpResponseHandler.handleMessage(AsyncHttpResponseHandler.java:173) 
12-21 01:01:11.180: E/AndroidRuntime(28502): at com.loopj.android.http.AsyncHttpResponseHandler$1.handleMessage(AsyncHttpResponseHandler.java:85) 
12-21 01:01:11.180: E/AndroidRuntime(28502): at android.os.Handler.dispatchMessage(Handler.java:99) 
12-21 01:01:11.180: E/AndroidRuntime(28502): at android.os.Looper.loop(Looper.java:150) 
12-21 01:01:11.180: E/AndroidRuntime(28502): at android.app.ActivityThread.main(ActivityThread.java:4263) 
12-21 01:01:11.180: E/AndroidRuntime(28502): at java.lang.reflect.Method.invokeNative(Native Method) 
12-21 01:01:11.180: E/AndroidRuntime(28502): at java.lang.reflect.Method.invoke(Method.java:507) 
12-21 01:01:11.180: E/AndroidRuntime(28502): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
12-21 01:01:11.180: E/AndroidRuntime(28502): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
12-21 01:01:11.180: E/AndroidRuntime(28502): at dalvik.system.NativeStart.main(Native Method) 

아싸! 나는 "스 니펫"을 올리려고했지만 어쩌면 전체 파일을 게시 했어야했는데 ...

+0

더 나은 답변을 얻기 위해 코드 스 니펫 중 일부를 게시 – Ramprasad

+0

코드를 보여주세요 ... –

답변

0

updateWeatherUi() 로직을 buildWeatherObject() 끝에 붙이면이 문제가 해결되었습니다.

문제는 내가 이전에 여기서 어떤 일이 일어나고 있는지 확실하지 않다는 것입니다. 로그는 원래 코드에서 imageLoader.DisplayImage(String, ImageView)의 포인트까지 올바른 데이터를 보여 주었지만 나는 계속 NullPointerException과 충돌했습니다.

관련 문제