我创建了一个Async-Download-Class,从界面网站下载JSON-Code。它确实有效,但有时它会中断,在下载日志中我可以看到应该是字符串的问号。之前我遇到过这个问题并通过增加缓冲区大小来解决它,但这会影响应用程序的速度。 您可以想象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;
编辑:是否有另一种从界面网站下载数据的方法?也许这会对我有所帮助。
答案 0 :(得分: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;
}
我的想法为何最终奏效:
使用这种下载数据的方式,您不需要定义一个可以满的缓冲区。
希望它也有助于其他人:)
度过美好的一天!
答案 1 :(得分:0)
如果使用其他编码(如UTF-8而不是ISO-8859-1)会发生什么?