我在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();
}
答案 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将处理这个......