【问题标题】:First AsycTask try gives me an arror第一次 AsyncTask 尝试给我一个错误
【发布时间】:2013-06-13 13:01:04
【问题描述】:

我正在尝试让我的操作栏完成对 api 的搜索并解析 json 结果。

我这样整理我的 asycTask:

private class ReadJSONResult extends AsyncTask
        <String, Void, String> {
            protected String doInBackground(String... urls) {
                return readJSONFeed(urls[0]);
            }

            protected void onPostExecute(String result) {
                try {

                    ///get 
                    JSONObject jsonObject = new JSONObject(result);
                    JSONObject weatherObservationItems = 
                        new JSONObject(jsonObject.getString("JSON"));

                    Toast.makeText(getBaseContext(), 
                        weatherObservationItems.getString("totalResults"), 
                     Toast.LENGTH_SHORT).show();


                } catch (Exception e) {
                    Log.d("ReadWeatherJSONFeedTask", e.getLocalizedMessage());
                }          
            }
        }

        //gets the json from the inputed url
        public String readJSONFeed(String URL) {
            StringBuilder stringBuilder = new StringBuilder();
            HttpClient httpClient = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(URL);
            try {
                HttpResponse response = httpClient.execute(httpGet);
                StatusLine statusLine = response.getStatusLine();
                int statusCode = statusLine.getStatusCode();
                if (statusCode == 200) {
                    HttpEntity entity = response.getEntity();
                    InputStream inputStream = entity.getContent();
                    BufferedReader reader = new BufferedReader(
                            new InputStreamReader(inputStream));
                    String line;
                    while ((line = reader.readLine()) != null) {
                        stringBuilder.append(line);
                    }
                    inputStream.close();
                } else {
                    Log.d("JSON", "Failed to download file");
                }
            } catch (Exception e) {
                Log.d("readJSONFeed", e.getLocalizedMessage());
            }        
            return stringBuilder.toString();
        }

我正在尝试了解 json 解析的工作原理,因此我尝试从我的 api 读取 json 并在 toast 中返回“totalResults”值,以查看我是否正确尝试。

我的 JSON 示例如下所示:

http://pastebin.com/RsUnz7AR

我在netbeans中的错误日志是:

06-13 13:51:43.228: D/libEGL(9944): loaded /vendor/lib/egl/libEGL_POWERVR_SGX540_120.so
06-13 13:51:43.244: D/libEGL(9944): loaded /vendor/lib/egl/libGLESv1_CM_POWERVR_SGX540_120.so
06-13 13:51:43.267: D/libEGL(9944): loaded /vendor/lib/egl/libGLESv2_POWERVR_SGX540_120.so
06-13 13:51:43.431: D/OpenGLRenderer(9944): Enabling debug mode 0
06-13 13:51:51.548: E/SpannableStringBuilder(9944): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
06-13 13:51:51.548: E/SpannableStringBuilder(9944): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
06-13 13:51:52.322: E/SpannableStringBuilder(9944): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
06-13 13:51:52.322: E/SpannableStringBuilder(9944): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
06-13 13:51:56.306: E/SpannableStringBuilder(9944): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
06-13 13:51:56.306: E/SpannableStringBuilder(9944): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
06-13 13:51:58.064: E/SpannableStringBuilder(9944): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
06-13 13:51:58.064: E/SpannableStringBuilder(9944): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
06-13 13:51:58.220: W/dalvikvm(9944): threadid=11: thread exiting with uncaught exception (group=0x40d4a930)
06-13 13:51:58.267: E/AndroidRuntime(9944): FATAL EXCEPTION: AsyncTask #1
06-13 13:51:58.267: E/AndroidRuntime(9944): java.lang.RuntimeException: An error occured while executing doInBackground()
06-13 13:51:58.267: E/AndroidRuntime(9944):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
06-13 13:51:58.267: E/AndroidRuntime(9944):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
06-13 13:51:58.267: E/AndroidRuntime(9944):     at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
06-13 13:51:58.267: E/AndroidRuntime(9944):     at java.util.concurrent.FutureTask.run(FutureTask.java:239)
06-13 13:51:58.267: E/AndroidRuntime(9944):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
06-13 13:51:58.267: E/AndroidRuntime(9944):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
06-13 13:51:58.267: E/AndroidRuntime(9944):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
06-13 13:51:58.267: E/AndroidRuntime(9944):     at java.lang.Thread.run(Thread.java:856)
06-13 13:51:58.267: E/AndroidRuntime(9944): Caused by: java.lang.IllegalArgumentException: Illegal character in query at index 114: http://api.brewerydb.com/v2/search?key=(API key goes here)&format=json&type=beer&withBreweries=y&q=90 
06-13 13:51:58.267: E/AndroidRuntime(9944):     at java.net.URI.create(URI.java:727)
06-13 13:51:58.267: E/AndroidRuntime(9944):     at org.apache.http.client.methods.HttpGet.<init>(HttpGet.java:75)
06-13 13:51:58.267: E/AndroidRuntime(9944):     at com.example.beerportfoliopro.MainActivity.readJSONFeed(MainActivity.java:96)
06-13 13:51:58.267: E/AndroidRuntime(9944):     at com.example.beerportfoliopro.MainActivity$ReadJSONResult.doInBackground(MainActivity.java:70)
06-13 13:51:58.267: E/AndroidRuntime(9944):     at com.example.beerportfoliopro.MainActivity$ReadJSONResult.doInBackground(MainActivity.java:1)
06-13 13:51:58.267: E/AndroidRuntime(9944):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
06-13 13:51:58.267: E/AndroidRuntime(9944):     at java.util.concurrent.FutureTask.run(FutureTask.java:234)
06-13 13:51:58.267: E/AndroidRuntime(9944):     ... 4 more

【问题讨论】:

  • 据说 IllegalArgumentException 意味着 url 中有一些错误,请检查它或对您的 url 进行编码。首先在浏览器中测试你的网址然后检查
  • 我也使用过 asyctask ,希望对你有帮助stackoverflow.com/questions/16296553/…

标签: android json android-listview android-asynctask


【解决方案1】:

它说索引 114 处有一个非法字符,这似乎在您的请求末尾。最后是否有可能增加空间?也许尝试在 logcat 中打印类似

Log.d("http_string_test", "[" + URL + "]");

查看 ] 之前是否有空格,如果有,请尝试减少通话中的空格。

【讨论】:

  • 好的 url 定义混乱。我添加了 urlFinal = URLEncoder.encode(jsonUrl, "UTF-8");这并没有解决任何问题。现在去看看没有编码的样子
  • 我想我发现了问题 android,由于键盘原因,在搜索结束时会自动添加一个空格,当我在单击搜索之前执行退格时,我没有强制关闭。如果存在空间,我怎么能把空间拿走?
  • 已修复,只需对查询女巫附加到 url 的 url 编码,而不是整个 url。
  • @Mike 很高兴听到,是的,我也做很多网络编程,空间可能会让人头疼。
【解决方案2】:

尝试使用URLEncoder.encode(String url) 对您的网址进行编码。 它可能会解决您的问题

【讨论】:

    【解决方案3】:

    您的网址末尾肯定有多余的空格。我可以使用以下代码在 Java 中重现您的错误:

    import java.net.URI;
    
    public class Main {
    
        public static void main(String[] argv) {
            URI uri = URI.create("http://api.brewerydb.com/v2/search?key=(key goes here)&format=json&type=beer&withBreweries=y&q=90 ");
            System.out.println(uri.toString());
        }
    
    }
    

    结果是:

    Exception in thread "main" java.lang.IllegalArgumentException
        at java.net.URI.create(URI.java:841)
        at Main.main(Main.java:6)
    Caused by: java.net.URISyntaxException: Illegal character in query at index 114: http://api.brewerydb.com/v2/search?key=(Key goes here)&format=json&type=beer&withBreweries=y&q=90 
        at java.net.URI$Parser.fail(URI.java:2810)
        at java.net.URI$Parser.checkChars(URI.java:2983)
        at java.net.URI$Parser.parseHierarchical(URI.java:3073)
        at java.net.URI$Parser.parse(URI.java:3015)
        at java.net.URI.<init>(URI.java:577)
        at java.net.URI.create(URI.java:839)
        ... 1 more
    

    一个简单的 URI.create(urls[0].trim()) 就可以解决了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-22
      • 1970-01-01
      • 1970-01-01
      • 2013-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多