我的ListView從Web服務器獲取數據。ListView onScroll導致SocketException
最初將獲取10個項目,之後再捲動10個等等。
也能正常工作4-5滾動,但後來給出了這樣的例外:
java.net.SocketException: Socket closed.
在此之後:
E/OSNetworkSystem(27034): JNI EX in read
,有時代替插座關閉,即使是這種例外情況:
java.io.IOException: Attempted read on closed stream
然後代替添加10 ne w項目,它增加了10個先前提取的項目。這是因爲我沒有替換適配器中使用的ArrayList中的項目,因爲有異常。
什麼原因導致此異常?
編輯:
它工作正常的第一3-5滾動,然後給我,因爲這異常的一些錯誤的數據(以前的數據),如果我繼續滾動,它工作正常後,再次給出了隨機例外。
代碼以獲取列表項:
POSTDATA到我使用POSTDATA從Web服務器
public static String PostData(String url, String sa[][]) {
DefaultHttpClient client = getThreadSafeClient();
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
int n = sa.length;
for (int i = 0; i < n; i++) {
nameValuePairs.add(new BasicNameValuePair(sa[i][0], sa[i][1]));
Log.d(sa[i][0], "" + sa[i][1]);
}
HttpPost httppost;
try {
httppost = new HttpPost(baseUrl + url);
} catch (Exception e) {
}
try {
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
} catch (UnsupportedEncodingException e) {
}
HttpResponse response = null;
try {
response = client.execute(httppost);
} catch (ClientProtocolException e) {
} catch (IOException e) {
} catch (Exception e) {
}
HttpEntity entity = response.getEntity();
try {
is = entity.getContent();
} catch (IllegalStateException e) {
} catch (IOException e) {
}
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "iso-8859-1"), 8);
sb = new StringBuilder();
sb.append(reader.readLine());
String line = "0";
while ((line = reader.readLine()) != null) {
sb.append("\n" + line);
}
is.close();
result = sb.toString();
} catch (Exception e) {
}
return result;
}
ThreadSafeClient獲取數據
public static DefaultHttpClient getThreadSafeClient() {
DefaultHttpClient client = new DefaultHttpClient();
ClientConnectionManager mgr = client.getConnectionManager();
HttpParams params = client.getParams();
client = new DefaultHttpClient(new ThreadSafeClientConnManager(params,
mgr.getSchemeRegistry()), params);
return client;
}
的AsyncTask在米在Activity中獲取新數據的活動。這就是所謂的onScroll
AsyncTask{
ArrayList<item> itemList = new Arraylist<item>();
doInBackground(){
String response = PostData(url, sa);
//sa has namevaluepairs as a 2-dimensional array
JSONArray JArray = new JSONArray(response);
for(int i = 0; i < jArray.length; i++){
itemList.add(convertToItem(JArrya.getJSONObject("items")));
}
}
onPostExecute(){
for(int i = 0; i < itemList.size(); i++){
mListAdapter.add(itemList.get(i));
}
mListAdapter.notifyDataSetChanged();
}
}
它的長碼,所以剛粘貼的重要線路
任何幫助表示讚賞。
編輯:
改變POSTDATA方法在此之後,它工作得很好。
public static String PostData(String url, String sa[][]) {
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
int n = sa.length;
for (int i = 0; i < n; i++) {
nameValuePairs.add(new BasicNameValuePair(sa[i][0], sa[i][1]));
}
HttpPost httppost;
httppost = new HttpPost(baseUrl + url);
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = null;
response = client.execute(httppost);
HttpEntity entity = response.getEntity();
String res = EntityUtils.toString(entity);
return res;
}
那麼,是不是因爲是(InputStream的)和SB(StringBuilder)對沒有前面的情況局部變量?
謝謝
套接字異常一般是不正確的網絡連接花花公子 – Anirudh
如果您的手機的互聯網連接斷開,這個異常被拋出,這不是唯一的原因,這可能是其中一個原因。 – Anirudh
你應該詳細說明你的網絡代碼,它是什麼以及它是如何調用列表滾動的,因爲這是錯誤可能發生的地方。 – Guykun