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

最善の方法は

非同期タスクを開始する前にデータ接続を確認できます

お気に入り

ブール値 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 に答える