【问题标题】:httpClient.execute(httpPost) causing crash (Android 4.1)httpClient.execute(httpPost) 导致崩溃(Android 4.1)
【发布时间】:2012-10-27 06:36:10
【问题描述】:

也许你可以帮帮我。我正在开发一个调用 Rotten Tomatoes API 的 Android 应用程序项目,该 API 返回 JSON 数据。但是每当我运行我的代码时,应用程序就会崩溃。给我带来问题的具体代码是 httpClient.execute(httpPost);

传递给该方法的 url 字符串很好,并且当我在浏览器中键入它时返回正确的数据,所以我知道这不是问题。我有点不知所措。我从来没有遇到过 HttpClient 的问题,尽管过去我只使用过 XML,从不使用 JSON。

我已经为此苦苦挣扎了一段时间。如果有人有任何见解,将不胜感激。

 public JSONObject getJSON(String url) {
    //Make HTTP Request
    try {

        //defaultHttpClient
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);
        //Log.d("RunTest", url);
        HttpResponse httpResponse = httpClient.execute(httpPost); // THIS LINE CAUSES APPLICATION TO CRASH
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();

    } catch (UnsupportedEncodingException uee) {
        Log.d("Exceptions", "UnsupportedEncodingException");
        uee.printStackTrace();
    } catch (ClientProtocolException cpe) {
        Log.d("Exceptions", "ClientProtocolException");
        cpe.printStackTrace();
    } catch (IOException ioe) {
        Log.d("Exceptions", "IOException");
        ioe.printStackTrace();
    }

10-27 02:52:44.484: I/Choreographer(627): Skipped 147 frames!  The application may be doing too much work on its main thread.
10-27 02:52:44.704: W/dalvikvm(627): threadid=12: thread exiting with uncaught exception (group=0x40a13300)
10-27 02:52:44.724: E/AndroidRuntime(627): FATAL EXCEPTION: AsyncTask #1
10-27 02:52:44.724: E/AndroidRuntime(627): java.lang.RuntimeException: An error occured while executing doInBackground()
10-27 02:52:44.724: E/AndroidRuntime(627):  at android.os.AsyncTask$3.done(AsyncTask.java:299)
10-27 02:52:44.724: E/AndroidRuntime(627):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
10-27 02:52:44.724: E/AndroidRuntime(627):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
10-27 02:52:44.724: E/AndroidRuntime(627):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
10-27 02:52:44.724: E/AndroidRuntime(627):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
10-27 02:52:44.724: E/AndroidRuntime(627):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
10-27 02:52:44.724: E/AndroidRuntime(627):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
10-27 02:52:44.724: E/AndroidRuntime(627):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
10-27 02:52:44.724: E/AndroidRuntime(627):  at java.lang.Thread.run(Thread.java:856)
10-27 02:52:44.724: E/AndroidRuntime(627): Caused by: java.lang.IllegalStateException: Target host must not be null, or set in parameters. scheme=null, host=null, path=api.rottentomatoes.com/api/public/v1.0/lists/movies/box_office.json
10-27 02:52:44.724: E/AndroidRuntime(627):  at org.apache.http.impl.client.DefaultRequestDirector.determineRoute(DefaultRequestDirector.java:591)
10-27 02:52:44.724: E/AndroidRuntime(627):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:293)
10-27 02:52:44.724: E/AndroidRuntime(627):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
10-27 02:52:44.724: E/AndroidRuntime(627):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
10-27 02:52:44.724: E/AndroidRuntime(627):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
10-27 02:52:44.724: E/AndroidRuntime(627):  at com.example.rottentomatoesclient.JSONParser.getJSON(JSONParser.java:39)
10-27 02:52:44.724: E/AndroidRuntime(627):  at com.example.rottentomatoesclient.MoviesActivity$getMovieList.doInBackground(MoviesActivity.java:90)
10-27 02:52:44.724: E/AndroidRuntime(627):  at com.example.rottentomatoesclient.MoviesActivity$getMovieList.doInBackground(MoviesActivity.java:1)
10-27 02:52:44.724: E/AndroidRuntime(627):  at android.os.AsyncTask$2.call(AsyncTask.java:287)
10-27 02:52:44.724: E/AndroidRuntime(627):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
10-27 02:52:44.724: E/AndroidRuntime(627):  ... 5 more
10-27 02:52:44.774: W/ActivityManager(148):   Force finishing activity com.example.rottentomatoesclient/.MoviesActivity

【问题讨论】:

  • 我从未收到任何 LogCat 错误。没有任何异常被抛出。
  • 你给Internet权限了吗?
  • 如果您的应用程序崩溃了,那么肯定会产生一些 logcat 错误。
  • 可能正在将此行 HttpPost httpPost = new HttpPost(url); 更改为 HttpGet httpget = new HttpGet(url); 工作希望对您有所帮助。
  • 确保您没有在主 UI 线程上运行此任务

标签: android httpclient httpresponse


【解决方案1】:

好的,您的网址可能正确。在长堆栈跟踪的中间,您可以找到以下内容:

Caused by: java.lang.IllegalStateException: 
Target host must not be null, or set in parameters. scheme=null, host=null,
path=api.rottentomatoes.com/api/public/v1.0/lists/movies/box_office.json

这看起来像是从服务器返回的错误 - 您没有提供所有参数。

【讨论】:

  • 好吧,我是个白痴。我忽略了将“http://”添加到 url 字符串。显然这是必不可少的。它还解释了为什么当我将 url 粘贴到浏览器的地址栏中时它运行良好。无论如何,它现在似乎工作正常。感谢所有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
  • 1970-01-01
  • 2014-11-22
相关资源
最近更新 更多