Android显示的进度对话框来自一个不在UI线程中的类

Android显示的进度对话框来自一个不在UI线程中的类,android,dialog,ui-thread,Android,Dialog,Ui Thread,我在RecordTable类中定义此方法,该类不是活动。 我从主UI线程调用它,并将有效的UI线程上下文作为参数传递 当然,它不适用于以下消息: java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序。 我在其他帖子中看到,他们建议使用runOnUiThread而不是new-thread,但由于该类不是活动,因此runOnUiThread不可用 在runnable()之外启动对话框也不起作用。 有人遇到这个问题并找到了解决方法吗?

我在RecordTable类中定义此方法,该类不是活动。
我从主UI线程调用它,并将有效的UI线程上下文作为参数传递
当然,它不适用于以下消息:
java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序。

我在其他帖子中看到,他们建议使用
runOnUiThread
而不是
new-thread
,但由于该类不是活动,因此
runOnUiThread
不可用

在runnable()之外启动对话框也不起作用。

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

public synchronized void scroll up(最终上下文、最终数组列表、最终整数计数){
新线程(newrunnable()){
公开募捐{
setScrolling(真);
ProgressDialog pd=ProgressDialog.show(context,”,context.getResources().getString(R.string.loading_msg),true);
int n=Math.max(mviewstarindex-count,0);
对于(int i=MVIEWStarIndex-1;i>=n;i--){
RecordTable.this.addFirstRow(list.get(i));
RecordTable.this.removeViews(RecordTable.this.getChildCount()-1,1);
}
pd.解散();
setScrolling(假);
}
}).start();
}
ProgressDialog pd;
语境;
公共同步无效滚动(上下文上下文、最终ArrayList列表、最终int计数){
this.context=上下文;
新线程(newrunnable()){
公开募捐{
setScrolling(真);
hand.sendEmptyMessage(0);
}
}
}).start();
int n=Math.max(mviewstarindex-count,0);
对于(int i=MVIEWStarIndex-1;i>=n;i--){
RecordTable.this.addFirstRow(list.get(i));
RecordTable.this.removeViews(RecordTable.this.getChildCount()-1,1);
pd.解散();
setScrolling(假);
}
Handler hand=new Handler()
{
@凌驾
公共无效handleMessage(消息消息消息)
{
pd=ProgressDialog.show(context,”,context.getResources().getString(R.string.loading_msg),true);
}
}
试试这个,它可能会帮助你。。。。
如果您想在类处理程序中创建任何对话框或Toast,那么在给定代码的情况下,我建议使用。 请查看异步任务的文档


doInBackground(..)
函数中的不同线程上执行所需的工作,并定期调用
progressUpdate
,该函数始终在UI线程上运行。实现起来更简单,而且您不必担心创建新线程。AsyncTask为您完成此任务

你试过context.rununuithread(新的Runnable(等))?@MuratNafiz我刚试过,
rununuithread
context
下不可用。你可以将你的上下文转换为你的活动。例如:((YourActivityName)context).runOnUiThread(new Runnable()…其中“YourActivityName”是您正在传递的活动context@MuratNafiz我刚刚试过,它没有给出任何错误,但是进度对话框没有显示,应用程序得到一个ANR。我运行
runnable()的主要原因
是在不阻塞UI线程的情况下执行for循环。您将所有代码放在可运行之外。:::我还非常确定,如果您在某些活动中运行,则句柄仅是一个解决方案。我不是。这是从RecordTable类中运行的:::
pd.disclose()
在您的解决方案中不起作用,就像
ProgressDialog.show()
对我不起作用一样。我将把您的建议作为最后手段。我确信它会起作用,我使用AsyncTask处理其他内容::::但是,仅仅因为我想显示一个进度对话框,就必须创建一个新类来运行6行代码,这真的让我很伤心…:-(但在第二种情况下,在这种特定情况下,我不能使用AsyncTask,因为
for
循环操作TableLayout,添加和删除TableRows.and doInBackground()无法处理UI元素。是的,doInBackground确实没有访问UI线程的权限,但onProgressUpdate有。因此,在您的for循环中,当您想要操作表布局时,请调用progressUpdate,并在其中执行操作,因为它在UI线程上运行。我不是100%确定,但我认为这将失去使用AsyncTask,它不会阻止后台工作的UI线程。这不会阻止UI线程。请阅读有关AsyncTask的文档。doInbackground正在处理seprate线程,而preExecute、postExecute和PorgResUpdate则在UI线程上
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);
    }
}