2

次のことをしたいアプリがあります。

  1. ボタンとTextViewを使用してアクティビティを表示します。
  2. ユーザーがボタンをクリックすると、アプリに進行状況ダイアログが表示されます。
  3. アプリはWebサービスを呼び出してリストを取得します。
  4. [進行状況]ダイアログが非表示になり、[リストの選択]ダイアログボックスが表示されて、取得したリストが表示されます。
  5. ユーザーはリスト内のアイテムの1つを選択します。
  6. アイテムはTextViewに表示されます。

問題は、これが発生することです。

  1. ボタンとTextViewを使用してアクティビティを表示します。
  2. ユーザーがボタンをクリックすると、ボタンの状態が選択済みに変わります。
  3. 数秒後、[リストの選択]ダイアログボックスが表示され、取得したリストが表示されます。
  4. ユーザーはリスト内のアイテムの1つを選択します。
  5. 進行状況ダイアログが数秒間表示された後、非表示になります。
  6. アイテムはTextViewに表示されます。

WebサービスはAsyncTaskで実行され、進行状況ダイアログはonPreExecute()メソッドに表示され、onPostExecute()メソッドで閉じられます。

public class WebService extends AsyncTask<Void, Void, Boolean> {

  public void onPreExecute() {
    _progressDialog = ProgressDialog.show(_context, "", message);
  }

  protected Boolean doInBackground(Void... params) {
    try {
      // Execute web service
    }
    catch (Exception e) {
      e.printStackTrace();
    }

    return true;
  }

  protected void onPostExecute(Boolean result) {
    _progressDialog.hide();
  }
}

Webサービスを実行してダイアログを表示するコード:

WebService ws= new WebService();
ws.execute();

// Web service saves retrieved list in local db

// Retrieve list from local db

AlertDialog.Builder db = new AlertDialog.Builder(context);
db.setTitle("Select an Item");
ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(context,
        android.R.layout.simple_selectable_list_item, list);
db.setAdapter(listAdapter, null);
db.show();

[リストの選択]ダイアログの前に進行状況ダイアログが表示されるように、コードに何かを追加する必要がありますか?

前もって感謝します。

4

2 に答える 2

0

これが私がそれを行う方法です:

public OnClickListener loginListener = new OnClickListener() {
    public void onClick(View v) {
        ProgressDialog progressDialog = new ProgressDialog(activity);
        progressDialog.setMessage("Logging in...");
        LoginTask loginTask = new LoginTask(activity, progressDialog, loginLayout, loggedInLayout);
        loginTask.execute();
    }
};

非同期タスク:

protected void onPreExecute() {
    progressDialog.show();
}

protected void onPostExecute(Integer responseCode) {
if (responseCode == 1) {
        progressDialog.dismiss();
        int duration = Toast.LENGTH_SHORT;
        Toast toast = Toast.makeText(activity.getApplicationContext(), "Logged in.", duration);
        toast.show();
        activity.bar.getTabAt(0).setText(dbHandler.getUserDetails().get("email"));

そのため、実際にメインアクティビティで ProgressDialog を作成し、タスクを宣言/実行する前にメッセージを設定します。次に、タスクはダイアログを表示および表示にします(非表示にはしません)。

これがうまくいくかどうか教えてください!

于 2012-06-05T15:59:41.043 に答える
0

私はまったく同じ問題を抱えていました。runOnUiTask ランナブルを使用して、ポストランナブルを使用して、タスクの前に進行状況ダイアログを表示しようとしました。それをやっているものは何もありませんでした。
ダイアログは、作業が完了した後に常に表示されるか、まったく表示されませんでした。

私が見つけた解決策は、doInBackgroundコードをtry{}catch{}ブロックに入れることです。

なぜそれが機能するのか私に聞かないでください。私の結論は、特定の状況下でメッセージ ハンドラーがメッセージをディスパッチするのをブロックする Android OS の設計に何か問題があるということです。そして、どういうわけか、try/catch がハンドラーにブレーキを与え、メッセージがディスパッチされます。

注: コードが例外をスローしない場合でも、try/catch ブロックを使用しました。

try {
     // code
}
catch( Exception e) { }
于 2012-06-10T12:54:28.430 に答える