如何在Android中正确实现progressBar?

时间:2012-03-19 07:20:13

标签: android

现在我正在做一个Android应用程序。在我的应用程序中,我必须从json页面获取数据。此操作需要时间延迟。所以我必须显示进度条,直到提取过程完成。我使用以下代码显示进度条。

 public void onCreate(Bundle savedInstanceState) {
//somecode
ProgressDialog progressBar = new ProgressDialog(this);
     progressBar.setCancelable(true);
      progressBar.setMessage("Loading");
      progressBar.show();
      Thread thread = new Thread(this);
      thread.start();

}
 public void run() {
    flag=GetFixtureDetailsJsonFunction();
    handler.sendEmptyMessage(0);
}
protected boolean GetFixtureDetailsJsonFunction() {
//json parsing code
return true
}
private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        if (flag==true) {
            progressBar.dismiss();
        }


    }
};

使用此代码我收到exception.android.view.ViewRoot $ CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触及其视图。

4 个答案:

答案 0 :(得分:5)

AsyncTask是从xml或数据库获取响应的最佳方式。试试这个,

private class DownloadQuestion extends AsyncTask<String, Void, String> 
    {           

        @Override
        protected void onPreExecute() 
        {

            pd = ProgressDialog.show(Activity_SplashScreen.this, "","Please wait...", true,false);                    

            super.onPreExecute();
        }

        @Override
        protected String doInBackground(String... urls) 
        {
            //Write background code here Code 
            return "";
        }

        @Override
        protected void onPostExecute(String response1) 
        {
            //Some Code.....

            if (pd != null && pd.isShowing())
                pd.dismiss();

        }
    }

答案 1 :(得分:1)

相反,我建议您实现AsyncTask,在android中称为Painless Threading

使用此AsyncTask,您无需为管理线程而烦恼。它很容易!!

仅供参考,请按以下步骤操作:

  1. onPreExecute()方法中显示ProgressBar。
  2. doInBackground()方法中执行长时间的任务。
  3. onPostExecute()方法中关闭ProgressBar。您也可以使用此方法显示各种操作。

答案 2 :(得分:1)

这是实现此功能的一种奇怪方式。我建议您使用AsyncTask而不是修复该代码,而AsyncTask是为此目的而实现的。请参阅here

答案 3 :(得分:1)

您正在尝试从另一个不符合条件的线程访问UI视图。在这种情况下,这是您的处理程序。

您应该使用AsyncTask并在其中执行progressDialog逻辑,而不是尝试访问此类UI线程。

  • 开始显示进度条onPreExecute
  • doInBackground()作业,而progressBar显示
  • 在doInBackground()完成onPostExecute()
  • 之后,最终解雇你的progressBar