1

我的第一个活动中只有一个httpclient用于所有其他活动。因为我使用的是PHP Sessions

在我的第一个活动中,我有一个列表视图,它需要 4-5 秒来加载项目(这将通过与服务器的连接来完成),并且在同一个活动中,我有一个搜索字段...单击按钮会将我带到使用相同 httpclient 搜索结果的 searchActivity 将加载到不同的列表视图中。我的问题是在第一个活动的 4-5 秒加载时间内,如果我尝试搜索某些内容,我的应用程序崩溃说:

SingleClientConnManager的使用无效:仍然分配了连接。

确保在分配另一个连接之前释放连接。

java.lang.IllegalStateException:没有包装的连接。

最终出现空指针异常

我认为在完成第一个活动之前我在 searchActivity 中使用相同的 httpclient 会产生此错误(如果错了,请纠正我)

因此,如果我的假设是正确的,我如何才能在我从第一个活动转移到 searchAvtivity 的意图中释放这种连接?

谢谢

代码:

    try {
        HttpPost httppost = new HttpPost(
                SignUpActivity.url+"/feed/fetchfeed");
        httppost.setHeader("X_REQUESTED_WITH", "xmlhttprequest");
        httppost.setHeader("MOBILE_DATA_REQUESTED", "mobileHttpRequest");
        HttpResponse response = SignUpActivity.httpclient.execute(httppost);

        Log.d("response", "" + response);
        HttpEntity entity = response.getEntity();

        Log.d("entity", "" + entity);
        is = entity.getContent();

        Log.d("is", "" + is);

        try {
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(is, "iso-8859-1"), 8);
            sb = new StringBuilder();
            sb.append(reader.readLine() + "\n");

            Log.d("sb", "" + sb);
            String line = "0";
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            result = sb.toString();
            Log.d("result", result);
        } catch (Exception e) {
            Log.e("error3", "Error in http connection" + e.toString());
        }

        Log.e("response", "response is:" + response.toString());
    } catch (Exception e) {
        Log.e("error4", "Error in http connection" + e.toString());
    }

    try {
        Log.d("JArray", "entered try");
        JArray = new JSONArray(result);
        feed_products_list = new ArrayList<Product>();
        Log.d("JArray", "try last line");
    } catch (JSONException e) {
        Log.d("JArray", "in catch");
        e.printStackTrace();
    }

    JSONObject jsonObj;
    JSONObject jsonObjStore;
    JSONObject jsonObjUser;

    for (int i = 0; i < JArray.length(); i++) {
        try {
            Log.d("jsonObj",
                    "entered try" + " " + i + " " + JArray.length());
            jsonObj = JArray.getJSONObject(i);
            jsonObjUser = jsonObj.getJSONObject("user");
        } catch (Exception e) {
            Log.d("jsonObj", "in catch");
            continue;
        }

        try {
            Log.d("feed_products_list", "entered try");
            Log.d("type of action", jsonObj.getString("action"));
            if (jsonObj.getString("action").equals("entry")) {
                Log.d("if block", "entered block 'entry'");

                jsonObjStore = jsonObj.getJSONObject("store");
                Log.d("store", jsonObjStore.getString("name"));

                feed_products_list.add(new Product(jsonObj.getInt("id"),
                        jsonObj.getString("action"), jsonObj
                                .getString("image"), jsonObj
                                .getString("product_name"), jsonObj
                                .getString("reported_price_formated"),
                        jsonObjStore.getString("name"), jsonObjStore
                                .getString("area"), jsonObjStore
                                .getString("city"), jsonObj
                                .getString("mrp"), jsonObjUser
                                .getString("name"), jsonObj
                                .getLong("reported_timestamp"), jsonObj
                                .getInt("discount"), jsonObjStore
                                .getDouble("lat"), jsonObjStore
                                .getDouble("lng")));

                Log.d("store id", jsonObjStore.getString("id"));
                Log.d("feed_products_list product: ",
                        feed_products_list.get(i).lat + "   "
                                + feed_products_list.get(i).lng);

            } else if (jsonObj.getString("action").equals("contest")) {
                Log.d("if block", "entered block 'contest'");
                feed_products_list.add(new Product(jsonObj.getInt("id"),
                        jsonObj.getString("action"), jsonObjUser
                                .getString("image"), jsonObj
                                .getString("product_name"), jsonObj
                                .getString("city"), jsonObjUser
                                .getString("name"), jsonObj
                                .getLong("reported_timestamp")));

                Log.d("feed_products_list",
                        feed_products_list.get(i).productName);

            }

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
    m = 1;
}

我添加了这个:

                try {
                    is.close();
            Intent intent = new Intent(FeedListViewActivity.this,
                            SearchActivity.class);
                    startActivity(intent);
                    Log.d("onClick", search_string);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

但我得到了同样的错误

4

1 回答 1

1

如果您关闭InputStream从 httpclient 获得的 ',连接将自动关闭。检查您的代码并确保您正确关闭它们。

于 2012-05-29T08:40:53.433 回答