0

我创建了一个 Async-Download-Class 来从接口网站下载 JSON 代码。它确实有效,但有时它会中断,在下载日志中我可以看到应该是字符串的问号。我之前遇到过这个问题,只是通过增加缓冲区大小来解决它,但这会影响应用程序的速度。正如您可以想象的那样,JSON-Reader 搜索时间戳但他找不到。所以我得到的错误是一个格式异常,但我认为这不相关。(有时也是不确定的对象)

10-17 18:38:11.443: D/debug(13532): {"ident":"50572","ts":"24.05.2011 07:40","content":"<inmydays> Bin ich der einzige der dachte, beim Film 1+1=10 geht es um Nerds und nicht darum, dass 2 Schauspieler die 10 Hauptrollen spielen?","rating":"2044"},
10-17 18:38:11.443: D/debug(13532): {"ident":"28685","ts":"20.12.2009 08:40","content":"<Frau> ich wohne jetzt hier fast 10 monate und habe heute endlich mal meinen nachbarn von nebenan kennengelernt[newline]<Alex> Glückwunsch [newline]<Frau> in der videothek... Hat sich 7 pornos ausgeliehen[newline]<Alex> lol","rating":"4787"},
10-17 18:38:11.443: D/debug(13532): {"ident":"12820�������������������������������������������������������������������������������������������������������������������������������������������������������������

*我删除了大部分问号以保持清晰。

@Override
    protected String doInBackground(String... params) {
        String urlStr = params[0];
        InputStream is = null;
        try {
            URL url = new URL(urlStr);
            HttpURLConnection connection = (HttpURLConnection) url
                    .openConnection();
            connection.setReadTimeout(100 * 1000);
            connection.setConnectTimeout(100 * 1000);
            connection.setRequestMethod("GET");
            connection.setDoInput(true);
            connection.connect();
            int response = connection.getResponseCode();
            Log.d("debug", "The response is: " + response);
            is = connection.getInputStream();

            // read string
            // buffersize:
            // ~max 1024 - 5
            //
            SharedPreferences sharedPref = PreferenceManager
                    .getDefaultSharedPreferences(activity);
            String displayed_items = sharedPref.getString(
                    "pref_key_numberofitems", "10");
            int items = Integer.parseInt(displayed_items);

            if (items > 10) {
                final int bufferSize = 40960 * 2;
                byte[] buffer = new byte[40960 * 2];
                ByteArrayOutputStream os = new ByteArrayOutputStream();
                while (true) {
                    int count = is.read(buffer, 0, bufferSize);
                    if (count == -1) {
                        break;
                    }

                    os.write(buffer);
                }
                os.close();

                result = new String(os.toByteArray(), "iso-8859-1");
                Log.d("debug", result);
            } else {
                final int bufferSize = 2048 * 7;
                byte[] buffer = new byte[2048 * 7];
                ByteArrayOutputStream os = new ByteArrayOutputStream();
                while (true) {
                    int count = is.read(buffer, 0, bufferSize);
                    if (count == -1) {
                        break;
                    }

                    os.write(buffer);
                }
                os.close();

                result = new String(os.toByteArray(), "iso-8859-1");
                Log.d("debug", result);
            }

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return result;

编辑:还有另一种从界面网站下载数据的方法吗?也许这会对我有所帮助。

4

2 回答 2

1

这解决了我的问题:

String result = "";

    @Override
    protected String doInBackground(String... params) {
        String urlStr = params[0];


        URL url;
        InputStream is = null;
        BufferedReader br;
        String line;

        try {
            url = new URL(urlStr);
            is = url.openStream();  // throws an IOException
            br = new BufferedReader(new InputStreamReader(is, "iso-8859-1"));

            while ((line = br.readLine()) != null) {
                result += line;
            }
        } catch (MalformedURLException mue) {
             mue.printStackTrace();
        } catch (IOException ioe) {
             ioe.printStackTrace();
        } finally {
            try {
                if (is != null) is.close();
            } catch (IOException ioe) {
                // nothing to see here
            }
        }

        Log.d("Downloaded", result);
        return result;
    }

我的想法为什么这最终奏效了:

使用这种下载数据的方式,您不需要定义一个可以满的缓冲区。

希望它也可以帮助其他人:)

祝你今天过得愉快!

于 2013-10-19T20:10:24.157 回答
0

如果您使用另一种编码(例如 UTF-8 而不是 ISO-8859-1)会发生什么情况?

于 2013-10-17T17:37:11.103 回答