0

你永远不能在 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();
               ....
    }
}
4

1 回答 1

2

是的,有一种方法可以使对话框不冻结,那就是使用“延迟加载”技术,如果您要填充的数据量很大,请将其分成较小的部分并相应地填充,您需要实现一种机制要知道何时必须填充新的“一块”数据,这在具有大量数据的应用程序中非常常见,通常使用“更新”或“刷新”消息......

希望这可以帮助..

问候!

于 2013-07-10T18:50:46.087 回答