0

このメソッドは、Activity ではない RecordTable クラスで定義します。
メイン UI スレッドから呼び出し、有効な UI スレッド コンテキストをパラメーターとして渡します。
もちろん、次のメッセージでは機能しません。
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

runOnUiThread代わりに使用することをお勧めする他の投稿を見ましたnew threadが、クラスはアクティビティrunOnUiThreadではないため、利用できません。

runnable() の外でダイアログを開始しても機能しません。

誰かがこの問題を抱えていて、それを解決する方法を見つけましたか?

public synchronized void scrollUp(final Context context, final ArrayList<Record> list, final int count) {
    new Thread(new Runnable() {
        public void run() {
            setScrolling(true);
            ProgressDialog pd = ProgressDialog.show(context, "", context.getResources().getString(R.string.loading_msg), true);
            int n = Math.max(mViewStartIndex - count, 0);
            for(int i = mViewStartIndex - 1; i >= n; i--) {
                RecordTable.this.addFirstRow(list.get(i));
                RecordTable.this.removeViews(RecordTable.this.getChildCount() - 1, 1);
            }
            pd.dismiss();
            setScrolling(false);
        }
    }).start();
}
4

2 に答える 2

2

コードを考えると、AsyncTaskを使用することをお勧めします。AsyncTask のドキュメントを参照してください。

常に UI スレッドで実行されるdoInBackground(....)への定期的な呼び出しを使用して、関数内の別のスレッドで必要な作業を実行します。progressUpdate実装がはるかに簡単で、新しいスレッドの作成について心配する必要はありません。AsyncTask がそれを行います。

于 2012-06-06T13:54:45.740 に答える
0
ProgressDialog pd;
Context context;

public synchronized void scrollUp(Context context, final ArrayList<Record> list, final int count) {
this.context = context;
new Thread(new Runnable() {
public void run() {
    setScrolling(true);
    hand.sendEmptyMessage(0);                
    }
  }
}).start();

int n = Math.max(mViewStartIndex - count, 0);
for(int i = mViewStartIndex - 1; i >= n; i--) {
RecordTable.this.addFirstRow(list.get(i));
RecordTable.this.removeViews(RecordTable.this.getChildCount() - 1, 1);

pd.dismiss();
setScrolling(false);
}


Handler hand = new Handler() 
{
    @Override
    public void handleMessage(Message msg) 
    {
              pd = ProgressDialog.show(context, "", context.getResources().getString(R.string.loading_msg), true);
    }
}

これを試してみてください....クラスハンドラーでダイアログまたはトーストを作成したい場合は、これを処理します...

于 2012-06-06T13:48:29.213 に答える