现在我正在做一个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:只有创建视图层次结构的原始线程才能触及其视图。
答案 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,您无需为管理线程而烦恼。它很容易!!
仅供参考,请按以下步骤操作:
onPreExecute()
方法中显示ProgressBar。doInBackground()
方法中执行长时间的任务。onPostExecute()
方法中关闭ProgressBar。您也可以使用此方法显示各种操作。答案 2 :(得分:1)
这是实现此功能的一种奇怪方式。我建议您使用AsyncTask而不是修复该代码,而AsyncTask是为此目的而实现的。请参阅here。
答案 3 :(得分:1)
您正在尝试从另一个不符合条件的线程访问UI视图。在这种情况下,这是您的处理程序。
您应该使用AsyncTask并在其中执行progressDialog逻辑,而不是尝试访问此类UI线程。