【问题标题】:HTTP Client API level 11 or greater in AndroidAndroid 中的 HTTP 客户端 API 级别 11 或更高级别
【发布时间】:2012-06-05 20:12:06
【问题描述】:

我有 Jersey 实现的 Restful Web Service。 我通过 HTTP 客户端从 Android 连接以获取数据。它在 API 级别 10 和更早的版本中运行良好,但在 API 级别 11 或更高版本中无法正常工作。我很感激任何帮助。我在这些版本中有一个 nullPointerException。

public String getBaseURI(String str) {
        String result = "";
        try {
            HttpParams httpParameters = new BasicHttpParams();
            int timeoutConnection = 3000;
            HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
            int timeoutSocket = 5000;
            HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
            DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
            HttpGet getRequest = new HttpGet(ServerAddress + str);
            getRequest.addHeader("accept", "application/json");
            HttpResponse response = httpClient.execute(getRequest);
            result = getResult(response).toString();
            httpClient.getConnectionManager().shutdown();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } 
        return result;
    }

private StringBuilder getResult(HttpResponse response) throws IllegalStateException, IOException {
        if (response.getStatusLine().getStatusCode() != 201) 
            throw new RuntimeException("Failed : HTTP error code : " + response.getStatusLine().getStatusCode());
        StringBuilder result = new StringBuilder();
        BufferedReader br = new BufferedReader(new InputStreamReader((response.getEntity().getContent())), 1024);
        String output;
        while ((output = br.readLine()) != null) 
            result.append(output);
        return result;      
    }

标签:AndroidRuntime

logcat 异常:

Exception: FATAL EXCEPTION: main
java.lang.NullPointerException
at com.android.internal.os.LoggingPrintStream.Prrintln(LogiingPrintStream.java.298)
at Client.getBaseURI (Client.java:66)

当我调用休息服务时,例如: String str = client.getBaseURI("task/project/get/" + user);
我收到错误。

private void listViewSet() {

        ListView lv = (ListView) this.findViewById(R.id.listView);
        lv.setAdapter(new MultiAdapter(this));

        lv.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int pos, long id) {

                switch (pos) {
            case ADD:
            String str = client.getBaseURI("task/project/get/" + user);// Json format
                        ......
                }
            }
        });
    }

【问题讨论】:

  • 如果您将 NullpointerException 信息添加到您的问题中,则更容易提供帮助。异常应该告诉哪一行导致它。
  • 明确 NullPointerException 在您的代码中出现的位置。我们不知道哪一行是“第 66 行”,而且您在帖子中的任何地方都没有提到 Client.java 类。

标签: android


【解决方案1】:

您是否在单独的线程上执行 HTTP 请求(例如,使用 AsyncTask)?

一些较新的 API(尤其是 ICS,根据我的经验)强制要求您在单独的线程上执行网络连接,以免阻塞 UI 线程。网络连接可能会很长且成本很高,因此您永远不会希望在 UI 线程上执行它们。这样做可能会阻止 UI 被绘制到屏幕上,导致您的应用程序强制关闭,使您的应用程序对用户显得迟钝等等。

【讨论】:

  • 不,不是 AsyncTask,当我添加到代码末尾时,我会在用户单击列表视图时调用它。
  • 如果您希望您的应用在所有设备上可靠运行,您需要在单独的线程上实现网络连接。这不是什么可抱怨的,因为无论如何你都应该这样做。不这样做会让你在市场上受到负面评价......:P。有关如何避免阻塞 UI 线程的更多信息,请阅读此article
  • 谢谢,你完全正确,如果我在线程中调用该方法,它就可以正常工作。
  • 这里的教训是永远不要阻塞 UI 线程。阻塞 UI 线程是不好的!! :)
  • 我还想指出,将代码包装在 AsyncTask 中可能比使用线程更容易... AsyncTask 被设计为抽象使用 @987654325 的一种方式@s 一起出去。只是一个建议;无论哪种方式都可以。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
  • 2018-02-25
  • 1970-01-01
  • 2021-08-19
  • 2012-07-22
  • 2012-07-24
相关资源
最近更新 更多