【问题标题】:How to properly implement a progressBar in Android?如何在Android中正确实现progressBar?
【发布时间】:2012-03-19 07:20:13
【问题描述】:

现在我正在做一个 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: 只有创建视图层次结构的原始线程才能触及其视图。

【问题讨论】:

标签: android


【解决方案1】:

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();

        }
    }

【讨论】:

    【解决方案2】:

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

    使用此 AsyncTask,您无需费心管理线程。而且很简单!!

    仅供参考,请执行以下操作:

    1. onPreExecute() 方法中显示ProgressBar。
    2. doInBackground() 方法中执行长时间运行的任务。
    3. 关闭onPostExecute() 方法中的ProgressBar。您还可以在此方法中进行显示类操作。

    【讨论】:

      【解决方案3】:

      实现此功能的方式有点奇怪。我建议您使用 AsyncTask,而不是修复该代码,它是为此目的而实现的。见here

      【讨论】:

        【解决方案4】:

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

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

        • 开始在PreExecute上显示进度条
        • doInBackground() 作业同时显示进度条
        • 最后在 doInBackground() onPostExecute() 完成后关闭你的 progressBar

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-20
          • 2017-09-22
          • 1970-01-01
          • 1970-01-01
          • 2023-03-23
          相关资源
          最近更新 更多