在我的应用程序中,当我点击Button时,它有时会显示progressdialog,有时候不会在点击按钮时显示progressdialog。
异步任务代码是:
public class LoadData extends AsyncTask<Void, Void, Void>
{
ProgressDialog pd;
@Override
protected void onPreExecute()
{
pd = ProgressDialog.show(MainActivity.this, "", "Loading...");
}
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
MainActivity.this.runOnUiThread(new Runnable() {
public void run() {
// TODO Auto-generated method stub
LoadActivities(); // function to load data from url
}
});
return null;
}
@Override
protected void onPostExecute(Void unused)
{
pd.dismiss();
}
}
并在按钮点击事件中将其称为:
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
new LoadMoreData().execute(null);
}
});
答案 0 :(得分:3)
错误地认为你在doInBackground
使用runOnUiThreade
。只需从代码中删除它。它解决了你的问题。
永远不要在doInBackground中使用任何线程。
答案 1 :(得分:1)
为什么你在 doInBackground 中再次使用run方法,doInBackground方法在后台线程上执行计算,所以不需要采用 runOnUiThread
MainActivity.this.runOnUiThread(new Runnable() {
public void run() {
// TODO Auto-generated method stub
LoadActivities(); // function to load data from url
}
});
只需写下
protected Boolean doInBackground(final String... args) {
try {
LoadActivities();
return true;
} catch (Exception e) {
Log.e("tag", "error", e);
return false;
}
}
并且还要更改new LoadMoreData().execute();
不写空
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
new LoadMoreData().execute();
}});
答案 2 :(得分:0)
Nirali的回答似乎是正确的,只是为了进一步解释和一些编辑。 进度对话框将在doInBackground方法返回值时显示。在你的代码中它只是创建另一个线程,并完成执行,所以要在LoadActivities执行时显示进度对话框,在doInBackground执行的同一个线程中执行该语句,所以改为以下:
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
MainActivity.this.runOnUiThread(new Runnable() {
LoadActivities(); // function to load data from url
return null;
}