【发布时间】:2013-07-10 18:41:06
【问题描述】:
您永远不能在 UI 线程(主线程)之外使用 UI 东西。但是在这种情况下该怎么办:
运行一个新线程来检索大量数据。同时,显示一个表示工作的 ProgressDialog。检索数据后,调用主线程并填充表。当使用大量数据填充表格时,ProgressDialog 会“冻结”几秒钟(因为 UI 线程正忙于填充表格)。
有没有办法让 ProgressDialog 在表格被填充时不“冻结”?
public class MyActivity extends Activity {
private ProgressDialog progressDialog;
private TableLayout tableLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tableLayout = (TableLayout)v.findViewById(R.id.myTable);
progressDialog = ProgressDialog.show(this, "", "Loading...");
new Thread(new Runnable() {
@Override
public void run() {
final List<Data> data = fetchBigDataFromInternet();
MyActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
tableLayout.removeAllViews();
for(Data d : data) { // This makes the progressDialog to freeze
TableRow tableRow = new TableRow(MyActivity.this);
tableLayout.addView(tableRow);
}
progressDialog.dismiss();
....
}
}
【问题讨论】:
-
"有什么办法可以让 ProgressDialog 不“冻结”" 是的,不要在 UI 线程上完成所有工作。发布您正在做的事情的代码也有帮助
-
好吧,我没有在 UI 线程中做这项工作。正如我所说,我启动了一个新线程来检索大量数据,但是当需要使用检索数据填充表时,我必须在 UI 线程中执行此操作,因为表是 UI 组件。
-
你需要发布你在做什么的代码,否则它只是一个盲目的猜测
-
@tyczj:我在上面添加了一些伪代码。希望能帮助到你。这个问题更像是一个理论问题,而不是一个寻求帮助的问题。
-
通过该代码 Martins 的答案就是您正在寻找的内容
标签: android multithreading progressdialog