ProgressDialog不会立即显示

时间:2012-04-07 00:08:12

标签: java android android-asynctask progressdialog android-ui

我正在尝试从互联网上获取数据,解析它然后向用户显示数据。该操作通常需要3秒左右,我想一个微调器ProgressDialog显示一条消息,说我正在加载数据。问题是ProgressDialog仅在加载几乎完成时显示。这是我的代码

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button load_routes = (Button)findViewById(R.id.load_routes);

    load_routes.setOnClickListener(new View.OnClickListener()
    {
        public void onClick(View v)
        {
            task_complete = false;
            progressBar = new ProgressDialog(v.getContext());
            progressBar.setCancelable(false);
            progressBar.setMessage("Fetching routes data ...");
            progressBar.setProgressStyle(ProgressDialog.STYLE_SPINNER);
            progressBar.show();

            if(haveNetworkConnection())
            {
                loading_routes_data(v);
            }
            else
            {
                progressBar.dismiss();
            }
        }
    });
}

这是我的函数,被称为onclick

private void loading_routes_data(View v)
{
    try
    {
        new Thread(new Runnable()
        {
            public void run()
            {
                while(!task_complete)
                {
                    refresh_routes();
                    try
                    {
                        Thread.sleep(1000);
                    }
                    catch(InterruptedException e)
                    {
                        e.printStackTrace();
                    }
                }
                runOnUiThread(new Runnable()
                {
                    public void run()
                    {
                        progressBar.dismiss();
                    }
                });
            }
        }).start();
    }
    catch(Exception e)
    {
    }

    while(!task_complete)
    {
    }
}

我的refresh_routes()函数获取数据,解析它然后将task_complete设置为true,我甚至不确定是否应该将它保留在while循环中。< / p>

这是我的大问题。我希望在点击按钮时立即显示ProgressDialog,然后我想致电refresh_routes(),一旦refresh_routes()完成,我想摆脱进度对话框。但我不确定如何去做。

如果有人可以告诉我如何以某篇文章作为例子来解决问题,那么我将非常感激。提前谢谢你:)

2 个答案:

答案 0 :(得分:2)

您通过在方法结束时调用while(!task_complete)来锁定UI线程。你真的应该使用AsyncTask进行这样的操作。这是AsyncTask应该是这样的:

private class MyAsyncTask extends AsyncTask<Void, Void, Void> {

    private ProgressDialog progressDialog;
    private Context context;

    public MyAsyncTask(Context context) {

        this.context = context;
    }

    @Override
    protected void onPreExecute() {

        super.onPreExecute();
        progressDialog = ProgressDialog.show( context, null, "Fetching routes data ..." );
    }

    @Override
    protected Void doInBackground( Void... params ) {

        while (!task_complete) {
            refresh_routes();
            try {
                Thread.sleep( 1000 );
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        return null;
    }

    @Override
    protected void onPostExecute( Void result ) {

        super.onPostExecute( result );
        progressDialog.dismiss();
    }
}

要执行此操作,您可以这样做:

new MyAsyncTask( this ).execute();

我不确定您的refresh_routes()方法是如何工作的,但您可以考虑在doInBackground()方法中移动它的功能。

答案 1 :(得分:1)

使用AsyncTask执行此操作。它为您提供了在Activity中执行多线程的强大功能。