如何在Android中正确实现progressBar?

如何在Android中正确实现progressBar?,android,Android,现在我正在做一个Android应用程序。在我的应用程序中,我必须从json页面获取数据。此操作需要时间延迟。因此,我必须显示progressbar,直到获取过程完成。我使用以下代码显示progressbar public void onCreate(Bundle savedInstanceState) { //somecode ProgressDialog progressBar = new ProgressDialog(this); progressBar.setCancelabl

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

 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$CalledFromErrorThreadException:只有创建视图层次结构的原始线程才能接触其视图。

相反,我建议您实现,这在android中称为

使用这个异步任务,您不需要费心管理线程。而且很简单

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

  • onPreExecute()
    方法中显示进度栏
  • doInBackground()方法中执行长时间运行的任务
  • 关闭
    onPostExecute()
    方法中的ProgressBar。您还可以使用此方法显示各种操作

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

    您正试图从另一个不合格的线程访问UI视图。在本例中,这是您的处理程序

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

    • 开始在PreExecute上显示进度条
    • doInBackground()作业,同时显示进度栏
    • 在完成doInBackground()之后,最后在postExecute()上关闭progressBar

    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();
    
            }
        }
    
    私有类下载任务
    {           
    @凌驾
    受保护的void onPreExecute()
    {
    pd=ProgressDialog.show(活动_SplashScreen.this,“,”请稍候…”,true,false);
    super.onPreExecute();
    }
    @凌驾
    受保护的字符串doInBackground(字符串…URL)
    {
    //在这里写背景代码
    返回“”;
    }
    @凌驾
    受保护的void onPostExecute(字符串响应1)
    {
    //一些代码。。。。。
    if(pd!=null&&pd.isShowing())
    pd.解散();
    }
    }
    
    sarath,请使用
    处理程序查看此更新进度条。。