Android Jellybean在HttpUrlConnection上下载失败的JSON

时间:2013-03-05 03:24:01

标签: android

我正在尝试使用JELLYBEAN API 17为Android应用程序下载json数据。

我还在清单文件中添加了对互联网的使用权限。

这是在活动中获取json数据的代码:

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

    //final Button btnLoad = (Button) findViewById(R.id.btnLoad);
    tvResult = (TextView) findViewById(R.id.txtView);
    //

}

   public void onClick(View v) {
    final LoadData data = new LoadData();
        Log.d("TAG","Button Pressed!");


                data.execute();
                tvResult.setText(data.get());


    }

public static  String getJSON(String url) throws IOException {
    URL u = new URL(url);
    HttpURLConnection c = (HttpURLConnection) u.openConnection();
    try {
        c.setRequestMethod("GET");
        c.setRequestProperty("Content-length", "0");
        c.setUseCaches(false);
        c.setAllowUserInteraction(false);

        c.connect();
        //int status = c.getResponseCode();


            BufferedReader br = new BufferedReader(new InputStreamReader(
                    c.getInputStream()));
            StringBuilder sb = new StringBuilder();
            String line ="";
            while ((line = br.readLine()) != null) {
                sb.append(line + "\n");
            }
            br.close();
            return sb.toString();


    }finally{
    c.disconnect();
    }
}
// Inner class for making an asyncTask
public class LoadData extends AsyncTask<Void, Void, String> {

    @Override
    protected String doInBackground(Void... params) {
        final TMDb tmdb = new TMDb();
        String data = "";
        try {
             data = getJSON("http://api.themoviedb.org/3/genre/list?api_key=#");                
         tvResult.setText(data);

          Log.d("TAG-DATA", data);
          Log.d("TAG", "RUN STARTED!");

        } catch (IOException e) {
            Log.d("ERROR", e.getMessage());
            e.printStackTrace();
        }
        return data;
    }

}

这适用于常规Java应用程序。但是在Android应用程序中往往会杀死活动。它产生了以下错误:

D/TAG(13771): Button Pressed!
W/dalvikvm(13771): threadid=11: thread exiting with uncaught exception (group=0x40bce930)
 E/AndroidRuntime(13771): FATAL EXCEPTION: Thread-6603
 E/AndroidRuntime(13771): java.lang.NullPointerException: println needs a message
 E/AndroidRuntime(13771):   at android.util.Log.println_native(Native Method)
 E/AndroidRuntime(13771):   at android.util.Log.d(Log.java:138)
 E/AndroidRuntime(13771):   at com.mjavacam.tmdb.MainActivity$1.run(MainActivity.java:88)
 E/AndroidRuntime(13771):   at java.lang.Thread.run(Thread.java:856)

任何人都可以通过以下方式向我展示:

  • 如何从Android应用程序正确发出http请求?

  • 确定我可能做错了什么?

1 个答案:

答案 0 :(得分:2)

错误发生在      Log.d(&#34;标签数据&#34;,数据); 从getJson类返回的数据字符串返回null。

您可以按如下方式更改阅读部分(即从http://api.themoviedb.org/3/genre/list?api_key=#读取响应) 您可以使用此

而不是使用BufferedReader
HttpResponse response;
HttpPost post = new HttpPost("http://api.themoviedb.org/3/genre/list?api_key=#");
HttpEntity httpEntity = response.getEntity();
String result = EntityUtils.toString(httpEntity);

现在你可以玩字符串结果了。