0

指定した間隔で Web サーバーにリクエストを送信し、XML データを取得するアプリを作成しました。次に、XML データを解析し、電話から情報 (テキスト メッセージ、連絡先など) を取得して、http ポスト リクエストでサーバーに送り返します。

問題は、アプリが情報を取得するのに通常数秒かかることです。これにより、アプリがクラッシュすることがよくあります。アプリが応答しなくなったことを示すダイアログが表示され、アプリを閉じるか待機するかを尋ねられます。待機を押すと、最終的に再び機能し始めます。

AsyncTask はこの問題の正しい解決策ですか?

私が本当に理解していないもう1つのことは、AsyncTaskが実際にどのように機能するかです。多くの作業を行い、アプリをクラッシュさせる 2 つのメソッドがあるとします。両方を 1 つの AsyncTask に入れて、doInBackground() から呼び出すことはできますか?

4

3 に答える 3

1

私はあなたにあなたの問題について簡単に説明します。

サーバーからデータを取得できない可能性が多くあります

  1. ネットワーク速度が非常に遅く、サーバーとXMLデータからすべての情報を取得しようとすると、この場合、ネットワークがクラ​​ッシュするとエラーが表示されます

  2. サーバーにないページにリクエストを送信する場合

ここで、コードの問題に直面している場合は、プロジェクトに実装したAsyncTaskクラスの完全なコードを提供します。これは正常に機能します。

private class GetLoginResponse extends AsyncTask<Void, Void, Boolean> {
    private ProgressDialog progressDialog;
    private String email;
    private String password;

    public GetLoginResponse(String emailId, String paswd) {
        this.email = emailId;
        this.password = paswd;
    }

    @Override
    protected void onPreExecute() {
        progressDialog = ProgressDialog.show(LoginActivity.this, "",
                "Loading....", true, false);
    }

    @Override
    protected Boolean doInBackground(Void... params) {

        try {
            DefaultHttpClient httpclient = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(url);
                            HttpResponse response = httpclient.execute(httpGet);
        //here u can check the reponse is ok and 200 
                         } catch (NetworkException e) {
            isNetworkError = true;
        }
        return false;
    }

    @Override
    protected void onPostExecute(Boolean data) {
        progressDialog.dismiss();
        System.out.println("lOGIN RESPONSE for email = " + email + data);
    }
}// end AsyncTask

これはあなたの問題を解決するでしょう。

于 2012-05-18T12:33:50.883 に答える
1

私はあなたが試みているようなものも実装しました。つまり、サーバーにリクエストを送信し、XML レスポンスを受信し、XML を解析し、結果を表示します。これを表示します。これには AsyncTask を使用しました。

AsynTaskを使用して実装した方法は次のとおりです

private class AsyncClass extends AsyncTask<Void, Void, Bundle>{
    @Override
protected Bundle doInBackground(Void... arg0) {
    Bundle b=startProcess();        

// startBundle() method do all the processing and return result in a bundle. You can as many methods from within startBundle() method

    return b;
}       

@Override
protected void onPostExecute(Bundle result) {
    Log.d(TAG , "In onPostExecute");
    dialog.dismiss();
    if(result==null)
        Toast.makeText(cont, "Can't process query.\nTry again later.", Toast.LENGTH_LONG).show();
    else{
        Intent in = new Intent(cont, QueryResultDisplay.class);
        Log.d(TAG , "Displaying");
        in.putExtras(result);        
        cont.startActivity(in);           
    }
}
于 2012-05-18T12:16:08.583 に答える
0

はい、AsyncTaskを使用できます。

doInBackground()で呼び出されるコードは、UIに触れてはなりません。

publishProgress()を使用してUIスレッドに触れることができます。

于 2012-05-18T12:08:04.883 に答える