Android进度条出现并隐藏

时间:2014-02-11 10:05:44

标签: android progress-bar

我有一个进度条,我不想合并一个数值来显示某些内容的加载。我只是希望ProgressBar出现,动画然后消失。

我用过:

public void buttonClick(View v){
      ProgressBar mProgress=(ProgressBar)findViewById(R.id.my_progress);
      mProgress.setVisibility(VISIBLE);     //line 1..

      //loading data from web... takes time

      mProgress.setVisibility(INVISIBLE);   //line 2..
}

但是当我运行此代码时,第1行和第2行都会执行,但之后UI会发生变化,这是不可取的。我想要在单击按钮时显示进度条,当从Web下载数据时,进度条应该消失。

我尝试从另一个线程设置可见性,但它不起作用,因为其他线程中不允许更改UI。

2 个答案:

答案 0 :(得分:1)

您在AsyncTask中下载数据吗?把这段代码

private class DownloadData extends AsyncTask<Void, Void, Void>{
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        mProgress.setVisibility(View.VISIBLE); 
    }
    @Override
    protected Void doInBackground(Void... params) {
        // download your data here
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        mProgress.setVisibility(View.GONE); 
    }
}

答案 1 :(得分:1)

使用AsyncTask

实现它的最佳方式

<强> MyTask.java

class MyTask extends AsyncTask<Void, Void, Void> {
    ProgressDialog dialog;
    Context context;
    MyTask(Context context){
        this.context=context;
    }
    @Override
    protected void onPreExecute() {
        dialog=new ProgressDialog(context);
        dialog.setMessage("Please wait...");
        dialog.setIndeterminate(true);
        dialog.setCancelable(false);
        dialog.show();
    }
    @Override
    protected Void doInBackground(Void... params) {
        //do your task here
    }
    @Override
    protected void onPostExecute(Void result) {
        if(dialog.isShowing()){
            dialog.dismiss();
        }
    }
}

您可以像这样开始任务:

public void buttonClick(View v){
    new MyTask(YourActivity.this).execute();
}

您可以相应地修改AsyncTask以检索结果。

希望它有所帮助。 :)