Android从不在UI线程中的类显示进度对话框

时间:2012-06-06 13:27:33

标签: android dialog ui-thread

我在RecordTable类中定义了此方法,该类不是Activity 我从主UI线程调用它并将有效的UI线程上下文作为参数传递。
当然,它不适用于消息:
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

我在其他帖子中看到他们建议使用runOnUiThread代替new thread,但由于该课程不是活动runOnUiThread,因此无法使用。

在runnable()之外启动Dialog也不起作用。

有没有人遇到这个问题并找到了解决方法?

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();
}

2 个答案:

答案 0 :(得分:2)

鉴于代码,我建议使用AsyncTask。 看一下AsyncTask的文档。

doInBackground(....)函数中的其他线程上执行您想要的工作,并定期调用progressUpdate,该调用始终在UI线程上运行。实现起来更简单,您不必担心创建新线程。 AsyncTask为你做到了。

答案 1 :(得分: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);
    }
}

试试这可能对你有帮助.... 如果你想在类处理程序中创建任何对话框或Toast将处理这个......