java - ProgressDialog 没有立即显示

标签 java android-asynctask progressdialog android

我正在尝试从互联网获取数据,解析它,然后将数据显示给用户。该操作通常需要 3 秒左右,我希望旋转进度对话框显示一条消息,说明我正在加载数据。问题是 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 循环内。

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

如果有人能以某篇文章为例或类似的内容向我展示如何解决问题,我将非常感激。预先感谢您:)

最佳答案

您可以通过在方法末尾调用 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() 方法内。

关于java - ProgressDialog 没有立即显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10050581/

相关文章:

android - 创建无限循环android的最佳方法

android - 当用户按下后退按钮时取消 AsyncTask

java - ObjectInputStream 和 getInputStream

java - 如何在spring application.properties中设置lombok.equalsAndHashCode.callSuper = call?

android - 在 onPostExecute() 中运行另一个 AsyncTask

android - 异步任务和监听器

Android 使进度对话框不可关闭

android - 删除进度对话框下方显示的百分比

java - 找不到适合 show(ActionBar,String) 方法的方法 DialogFragment.show(FragmentTransaction,String) 不适用

java - RestEasy - Jax-rs - 在响应正文中发送自定义对象