0

我正在尝试从 Internet 获取数据,对其进行解析,然后将数据显示给用户。该动作通常需要 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_completetrue,我什至不确定是否应该将其保留在 while 循环中。

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

如果有人能以一些文章为例或类似的东西向我展示如何解决问题,我将不胜感激。先感谢您 :)

4

2 回答 2

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()方法中。

于 2012-04-07T00:33:42.760 回答
1

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

于 2012-04-07T00:26:17.430 回答