0

我有一个我似乎无法解决的非常疯狂的问题。我尝试了许多不同的方法,但它似乎没有像我预期的那样工作。我想要的是当用户单击我的 MainActivity 上的按钮时,它应该产生一个由 AsyncTask 提供的新线程。MainActivity 应该同时显示一个 ProgressDialog。新创建的线程负责使用 HTTP 连接通过 url 获取 xml,对其进行解析并将数据存储在本地数据库中。

我想要的是 AsyncTask 线程抛出超时异常,或者在没有数据连接或 xml 在 url 上不可用的情况下抛出任何异常。它必须在那时关闭 ProgressDialog。

这就是我所做的,有时它可以工作,但有时它只是长时间显示 ProgressDialog

class RetreiveFeedTask extends AsyncTask<String, Void, String> {
    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        pd = ProgressDialog.show(MainActivity.this, "Working..",
                "Fetching Values", false,true);

    }

    protected String doInBackground(String... params) {
        String xml = null;
        try {

            XmlPullParser parser = Xml.newPullParser();
            parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES,
                    false);

            HttpGet method = new HttpGet(
                    new URI(
                            "http://www.blahblahblah.xml"));
            HttpParams httpParameters = new BasicHttpParams();
            int timeoutConnection = 5000;
            HttpConnectionParams.setConnectionTimeout(httpParameters,
                    timeoutConnection);
            int timeoutSocket = 5000;
            HttpConnectionParams
                    .setSoTimeout(httpParameters, timeoutSocket);

            DefaultHttpClient client = new DefaultHttpClient();


            HttpResponse res = client.execute(method);

            InputStream is = res.getEntity().getContent();
            parser.setInput(is, null);


            int eventType = parser.getEventType();

            parser.nextTag();

            while (eventType != XmlPullParser.END_DOCUMENT) {
                if (eventType == XmlPullParser.START_TAG) {
                    if (parser.getAttributeCount() == 2) {

                        myDbHelper.update(parser.getAttributeValue(0),
                                parser.getAttributeValue(1));

                    }
                }
                eventType = parser.next();
            }
            System.out.println("End document");

            xml = "Done, Database updated :)";
        } 


        catch (Exception e) {
            xml = "Error: Unable to fetch data";
             e.printStackTrace();

        }
        return xml;
    }
@Override
    protected void onPostExecute(String xml) {
pd.dismiss();
        Toast.makeText(MainActivity.this, xml, Toast.LENGTH_SHORT).show();
    }

}
4

2 回答 2

2

最好的方法是

您可以在启动异步任务之前检查数据连接

boolean isInternetConnectd;

if(isInternetConnectd) { // 执行网络相关任务.... } else { // 显示对话框“互联网连接不可用” }

于 2012-09-14T19:36:18.737 回答
1

就超时而言,您实际上并没有使用您正在设置的参数。改变:

DefaultHttpClient client = new DefaultHttpClient();

到:

DefaultHttpClient client = new DefaultHttpClient(httpParameters);
于 2012-09-14T19:33:52.897 回答