2012-09-05 105 views
1

我試圖教我自己製作android應用程序,因此我正在嘗試創建一個應用程序,以在列表視圖中顯示來自tumblr帳戶的圖像。解析來自Tumblr的JSONObject

我有一些問題解析JSONObject和我的應用程序崩潰,因爲nullPointerException。

我的代碼如下所示:

public class Example extends Activity { 

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

    ArrayList<Tweet> tweets; 
    try { 
     tweets = getTweets(); 
     ListView listView = (ListView) findViewById(R.id.ListViewId); 
     listView.setAdapter(new UserItemAdapter(this, R.layout.listitem, 
       tweets)); 
    } catch (ClientProtocolException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (JSONException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

public class UserItemAdapter extends ArrayAdapter<Tweet> { 
    private ArrayList<Tweet> tweets; 

    public UserItemAdapter(Context context, int imageViewResourceId, 
      ArrayList<Tweet> tweets) { 
     super(context, imageViewResourceId, tweets); 
     this.tweets = tweets; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 
     if (v == null) { 
      LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.listitem, null); 
     } 

     Tweet tweet = tweets.get(position); 
     if (tweet != null) { 

      ImageView image = (ImageView) v.findViewById(R.id.avatar); 

      if (image != null) { 
       image.setImageBitmap(getBitmap(tweet.image_url)); 
      } 
     } 
     return v; 
    } 
} 

public Bitmap getBitmap(String bitmapUrl) { 
    try { 
     URL url = new URL(bitmapUrl); 
     return BitmapFactory.decodeStream(url.openConnection() 
       .getInputStream()); 
    } catch (Exception ex) { 
     return null; 
    } 
} 

public ArrayList<Tweet> getTweets() throws ClientProtocolException, 
     IOException, JSONException { 
    String searchUrl = "http://api.tumblr.com/v2/blog/www.richkidsofinstagram.tumblr.com/posts?api_key=API_KEY"; 

    ArrayList<Tweet> tweets = new ArrayList<Tweet>(); 

    HttpClient client = new DefaultHttpClient(); 
    HttpGet get = new HttpGet(searchUrl); 

    ResponseHandler<String> responseHandler = new BasicResponseHandler(); 

    String responseBody = null; 
    try { 
     responseBody = client.execute(get, responseHandler); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 

    JSONObject jsonObject = new JSONObject(responseBody); 

    JSONArray arr = null; 

    try { 
     arr = jsonObject.getJSONArray("results"); 
    } catch (Exception ex) { 
     Log.v("TEST", "Exception: " + ex.getMessage()); 
    } 

    for (int i = 0; i < arr.length(); i++) { 
     Tweet tweet = new Tweet(arr.getJSONObject(i).getString("photos")); 
     tweets.add(tweet); 
    } 

    return tweets; 
} 

public class Tweet { 

    public String image_url; 

    public Tweet(String url) { 

     this.image_url = url; 
    } 
    } 
    } 

的NullPointerException異常發生在行124:

for (int i = 0; i < arr.length(); i++) { 
     Tweet tweet = new Tweet(arr.getJSONObject(i).getString("photos")); 
     tweets.add(tweet); 
    } 

而且我已經通過驗證www.jsonlint.com地址和JSON看起來是這樣的:

{ 
"meta": { 
    "status": 200, 
    "msg": "OK" 
}, 
"response": { 
    "blog": { 
     "title": "Rich Kids Of Instagram", 
     "posts": 154, 
     "name": "richkidsofinstagram", 
     "url": "http://richkidsofinstagram.tumblr.com/", 
     "updated": 1346803265, 
     "description": "They have more money than you and this is what they do. 
     "ask": true, 
     "ask_anon": true 
    }, 
    "posts": [ 
     { 
      "blog_name": "richkidsofinstagram", 
      "id": 30900248446, 
      "post_url":   "http://richkidsofinstagram.tumblr.com/post/30900248446/hamptons-are-good", 
      "slug": "hamptons-are-good", 
      "type": "photo", 
      "date": "2012-09-04 23:58:45 GMT", 
      "timestamp": 1346803125, 
      "state": "published", 
      "format": "html", 
      "reblog_key": "2KosMjea", 
      "tags": [ 
       "pool", 
       "hamptons", 
       "summer", 
       "rich", 
       "wealth" 
      ], 
      "highlighted": [], 
      "note_count": 99, 
      "caption": "<p><span>The Hamptons are…….. good. by matthewmorton</span></p>", 
      "photos": [ 
       { 
        "caption": "", 
        "alt_sizes": [ 
         { 
          "width": 500, 
          "height": 500, 
          "url": "http://24.media.tumblr.com/tumblr_m9uiqy9Mi71rb86ldo1_500.jpg" 
         }, 
         { 
          "width": 400, 
          "height": 400, 
          "url": "http://25.media.tumblr.com/tumblr_m9uiqy9Mi71rb86ldo1_400.jpg" 
         }, 
         { 
          "width": 250, 
          "height": 250, 
          "url": "http://25.media.tumblr.com/tumblr_m9uiqy9Mi71rb86ldo1_250.jpg" 
         }, 
         { 
          "width": 100, 
          "height": 100, 
          "url": "http://25.media.tumblr.com/tumblr_m9uiqy9Mi71rb86ldo1_100.jpg" 
         }, 
         { 
          "width": 75, 
          "height": 75, 
          "url": "http://25.media.tumblr.com/tumblr_m9uiqy9Mi71rb86ldo1_75sq.jpg" 
         } 
        ], 
        "original_size": { 
         "width": 500, 
         "height": 500, 
         "url": "http://24.media.tumblr.com/tumblr_m9uiqy9Mi71rb86ldo1_500.jpg" 
        } 
       } 
      ] 
     }, 

我認爲問題在於我沒有指定我想要的圖片大小或某些圖片大小這樣的興奮,但我不知道如何解決這個問題。

如果有人可以幫我解決這個問題,它會被高度評價。

+0

有兩點需要討論,第一:你的json沒有從你的json數組獲取結果標籤,第二:你的照片標籤有json對象的數組而不是json – rajpara

+0

感謝您的幫助。相反og結果應該說「帖子」,因爲我想獲取圖像。但是當「照片」也是一個數組時,我應該如何設置這個我的代碼? – Fansher

回答

0

注意確定哪一行正好是124,複製並粘貼你的代碼,並且最終總共只有115行?反正這裏有雲:

for (int i = 0; i < arr.length(); i++) { 

通常應該是罰款,因爲該調用設置arr應該拋出一個異常JSONException如果沒有名爲「結果」的數組。不過,你吃了那個例外,只是記錄下來,這可能會使arr的值爲null。另外,我沒有在你的JSON中看到任何「結果」,你的意思是「迴應」?這是我的猜測,如果你得到NullPointerException

可能停止閱讀這裏,如果你想要的,但要解釋爲什麼我猜接下來的2線不是124 /不是一個拋出異常:

Tweet tweet = new Tweet(arr.getJSONObject(i).getString("photos")); 

這看起來安全監守如果arr不爲空getJSONObject()應返回值爲您的i值。如果找不到「照片」,getString()會拋出JSONException。 (我不確定那個Tweet類是什麼,所以如果「照片」返回null並且Tweet構造者死於空參數,那麼可能是這樣,但我不知道......)

tweets.add(tweet); 

這看起來很安全,因爲您初始化爲tweetsnew ArrayList<Tweet>();,即使tweet爲空,ArrayList()也不會有問題。

+0

哦,非常感謝你幫助我。 第124行是這樣的:for(int i = 0; i Fansher