0

我有以下代码用于通过 asynctask 执行 xml 下载,用于针对 android 版本>3 的 android 应用程序。如果网络/互联网连接良好,则代码工作得很好。但是,如果互联网连接不好,应用程序将强制关闭。我试过抛出不同类型的错误捕获,但仍然无法解决网络连接低时强制关闭的问题。

任何人有任何建议我可以尝试

private class DownloadWebPageXML extends AsyncTask<String, Void, InputStream> {
    @Override
    protected InputStream doInBackground(String... urls) {
        Log.d("mylogitem", "AsyncTask started!");
        InputStream content = null;
        String myurl = urls[0];

        AndroidHttpClient client = AndroidHttpClient.newInstance("Android");
        HttpGet httpGet = new HttpGet(myurl);
        try {
             HttpResponse execute = client.execute(httpGet);
             content = execute.getEntity().getContent();
        } catch (Exception e) {
            xmldownloaderror = e.getMessage();
            Log.d("mylogitem", e.getMessage());
        } finally {
            Log.d("mylogitem", "Closing AndroidHttpClient");
            client.close();
        }
        return content;
    }

    @Override
    protected void onPostExecute(InputStream result) {
        //do xml reader on inputstream
    }   
}
4

3 回答 3

1

在这两行之间添加对变量执行的空检查

 HttpResponse execute = client.execute(httpGet);
 if(execute == null){ return null;} // null check to see if execute is null
 content = execute.getEntity().getContent();

onPostExecute 中的另一件事,第一行应该检查 InputStream 结果是否为空!

@Override
    protected void onPostExecute(InputStream result) {
        if(result == null){
         Log.d("TEMP_LOG",Content is null);
         return;
        }
        //do xml reader on inputstream
    }  

检查并发布您的发现

于 2013-08-28T09:52:20.133 回答
1

嗯...我建议设置连接时间。

HttpClient 客户端 = 新 DefaultHttpClient();

HttpResponse 响应;BufferedReader bufferedReader = null;

HttpParams 参数 = client.getParams();

HttpConnectionParams.setConnectionTimeout(参数,20000);

HttpConnectionParams.setSoTimeout(params, 20000);

于 2013-08-28T10:01:10.363 回答
0

我找到了根本原因。它不在dobackground中。在我的情况下,糟糕的连接有时会返回不是 xml 数据类型而是加载错误,这在 postexecute 中作为输入流传递给我的 xmlparser。

我没有在我的 xmlparser 中添加太多错误捕获器。xmlparser 期待 xml 文档,但收到了非 xml 内容,因此抛出了我没有用错误捕获器覆盖的 null。

感谢您的建议。我也把它放在我的代码中。

于 2013-08-28T13:52:31.930 回答