我试图在ProgressDialog
在onPreExecute()中启动时显示AsyncTask
,在doInBackground()
中执行某项操作,并在{{{}}中关闭ProgressDialog
1}}。
无处不在,我认为这应该是简单而直接的,但我必须做错事。
每当我点击我的应用中的onPostExecute()
进行更新并运行Button
时,该应用会冻结,等待一下,然后AsyncTask
会立即显示并消失,随着工作在ProgressDialog
已完成。我不明白为什么doInBackground()
在onPreExecute()
之后运行,但这似乎正是这里发生的事情。这是代码:
doInBackground()
MainActivity中的onClickListener:
public class UpdateStats extends AsyncTask<CatchAPI, Void, String[]> {
private ProgressDialog pdia;
private Context context;
private APIParser parser = new APIParser();
public UpdateStats(Context contexts) {
context = contexts;
}
@Override
protected void onPreExecute() {
pdia = new ProgressDialog(context);
pdia.setMessage("Loading...");
pdia.show();
super.onPreExecute();
}
@Override
protected String[] doInBackground(CatchAPI... api) {
String apiOutput = api[0].returnAPI();
return new String[] {
parser.getPoolName(apiOutput),
parser.getHashRate(apiOutput),
parser.getWorkers(apiOutput),
parser.getSharesThisRound(apiOutput)
};
}
@Override
protected void onPostExecute(String[] result) {
pdia.dismiss();
super.onPostExecute(result);
}
}
答案 0 :(得分:7)
在这里:
text = updater.execute(api).get(); //<<<
您正在调用AsyncTask.get(),冻结UI线程执行,直到doInBackground
执行未完成。执行AsyncTask as:
updater.execute(api)
并更新onPostExecute
内的UI元素,在doInBackground
执行完成时调用UI线程。
@Override
protected void onPostExecute(String[] result) {
pdia.dismiss();
// update UI here..
poolNameTV.setText(result[0]);
hashRateTV.setText(result[1]);
workersTV.setText(result[2]);
sharesThisRoundTV.setText(result[3]);
super.onPostExecute(result);
}