0

ここで「progressDialogが機能しない」スレッドのほとんどを検索しましたが、答えがどれもうまくいかないようです。

別のスレッドで実行されるメソッドを呼び出す新しいアクティビティを作成しようとしています (最大 30 ~ 50 秒かかります)。

public class FLActivity extends ListActivity {

    private ProgressDialog mProgressDialog;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mProgressDialog = ProgressDialog.show(FLActivity.this, "", 
                                              "Loading...");

        OtherClass.LongDurationMethodWhichStartsAWorkedThread();

        mProgressDiagog.dismiss();
    }
}

長期間の方法は次のとおりです。

// in some other class
public static LongDurationMethodWhichStartsAWorkedThread() {
    Runnable r = new FFThread();
    Thread thread = new Thread(r);

    thread.start();
    try {
        thread.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch  (Exception e) {
        e.printStackTrace();
    }
}

thread.join() を使用して、ワーカー スレッドが実行されるのを待ってから続行しました。

ただし、メッセージは表示されません。

誰でも問題を見ることができますか?

4

2 に答える 2

1

LongDurationMethodWhichStartsAWorkedThread();スレッドの開始はブロッキング呼び出しではないため、すぐに戻ります。したがって、おそらく何が起こっているのかというと、進行状況ダイアログが表示されてからほぼ瞬時にクリアされるため、まったく表示されていないと思われます。

代わりに、Thread/Handler またはAsyncTaskを使用して実行時間の長い操作を実装し、ユーザーの進行状況を表示する必要があります。

このページには、それを実装する方法の優れた概要がありますが、これが唯一のオプションではないことは確かです。「AsyncTask の例」を Google 検索すると、多くの選択肢が得られます。

private class LongOperation extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... params) {
        // perform long running operation operation
        return null;
    }

    /* (non-Javadoc)
     * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
     */
    @Override
    protected void onPostExecute(String result) {
        // execution of result of Long time consuming operation
    }

    /* (non-Javadoc)
     * @see android.os.AsyncTask#onPreExecute()
     */
    @Override
    protected void onPreExecute() {
    // Things to be done before execution of long running operation. For example showing ProgessDialog
    }

    /* (non-Javadoc)
     * @see android.os.AsyncTask#onProgressUpdate(Progress[])
     */
    @Override
    protected void onProgressUpdate(Void... values) {
      // Things to be done while execution of long running operation is in progress. For example updating ProgessDialog
     }
}
于 2012-07-14T15:20:38.733 に答える
1

問題は、メイン スレッドから thread.join() を呼び出すと、UI スレッドがブロックされることです。作業スレッドが完了するのを待っているだけなので、ダイアログを表示できません。次の 2 点をお勧めします。

  1. 負荷の高い操作をバックグラウンドで実行するにはAsyncTaskを使用します。独自のスレッドを作成して UI スレッドと同期するよりも簡単です。
  2. Activity.onCreateDialogヘルパー メソッドですべてのダイアログを作成し、 Activity.showDialogを使用してそれらを表示します。これは、構成の変更に対処するのに役立ちます。
于 2012-07-14T15:26:54.120 に答える