gpt4 book ai didi

android - ListView onScroll 导致 SocketException

转载 作者:行者123 更新时间:2023-11-29 21:56:01 28 4
gpt4 key购买 nike

我的 ListView 从网络服务器获取数据。

最初将获取 10 个项目,然后滚动 10 个,依此类推。

这适用于 4-5 卷轴但稍后会出现此异常:

java.net.SocketException: Socket closed.

在此之后:

E/OSNetworkSystem(27034): JNI EX in read

有时甚至会发生这种异常,而不是Socket closed:

java.io.IOException: Attempted read on closed stream

然后它没有添加 10 个新项目,而是添加了 10 个以前获取的项目。这是因为由于异常,我没有替换适配器中使用的 ArrayList 中的项目。

是什么导致了这个异常?

编辑:

它在前 3-5 次滚动时工作正常,然后由于这个异常而给我一些错误的数据(以前的数据),如果我继续滚动,它稍后工作正常,稍后再次随机给出异常。

获取列表项的代码:

postData 从网络服务器获取数据

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;
}

我在 PostData 中使用的 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;
}

在我的 Activity 中使用 AsyncTask 来获取新的滚动数据。这个在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;
}

所以,是不是因为is(InputStream)sb(Stringbuilder)在前面的例子中不是Local Variables

谢谢

最佳答案

您的方法 PostData() 不是线程安全的,因为您使用的是两个未在该方法中定义的对象:

is = entity.getContent();
sb = new StringBuilder();

这会导致来自其他正在运行的线程的套接字被关闭:

is.close();

将它们都定义为本地方法,它应该可以解决问题。

问候。

关于android - ListView onScroll 导致 SocketException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13249704/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com