我试图仅在任务运行时显示进度条,这是我的代码
public void onButtonPressed() {
//loadingSpinner is a ProgressBar already instantiated whit visibility GONE;
loadingSpinner.setVisibility(View.VISIBLE);
boolean resultFromAsyncTask = AnotherClass.AsyncTaskMethod();
if(resultFromAsyncTask ) {
loadingSpinner.setVisibility(View.GONE);
//do something
finish();
}else{
loadingSpinner.setVisibility(View.GONE);
//Show alert
}
}
问题是,当我第一次更改可见性时,什么也没发生。我想念什么?
答案 0 :(得分:2)
不要太复杂,AsyncTask
拥有完成此任务所需的所有方法。
在AsyncTask的loadingSpinner.setVisibility(View.VISIBLE);
内设置onPreExecute
,并在loadingSpinner.setVisibility(View.GONE);
内设置onPostExecute
。
赞:
private class YourTask extends AsyncTask<String, Void, String> {
@Override protected void onPreExecute(){
loadingSpinner.setVisibility(View.VISIBLE);
}
@Override
protected String doInBackground(String... params) {
//Do background work
}
@Override protected void onPostExecute(String result) {
loadingSpinner.setVisibility(View.GONE);
}
}
答案 1 :(得分:1)
您正在调用Async任务,但是像常规函数一样使用它。您不能根据这样的Async任务的结果创建代码,代码将直接在代码之上运行并执行下一行。
您想要的是显示进度条,然后启动任务而没有这样的回报。您需要类似onPostExecute中的广播的内容,以回调到调用类,以使其在完成时知道。
在这种情况下,请进行编辑**,因为布尔默认为false,因此它将在if语句中使用该值,并在显示时立即将其隐藏。
答案 2 :(得分:0)
以@Notsileous为基础,从AsyncTask的onPostExecute
方法中调用一个可以完成一些UI工作的方法。您可能需要将该代码包装在runOnUiThread
中才能正常工作。
以您的代码为例:
public void onButtonPressed() {
//loadingSpinner is a ProgressBar already instantiated whit visibility GONE;
loadingSpinner.setVisibility(View.VISIBLE);
AnotherClass.AsyncTaskMethod().execute();
}
[...]
public void doneLoading(boolean resultFromAsyncTask ) {
runOnUiThread {
if(resultFromAsyncTask ) {
loadingSpinner.setVisibility(View.GONE);
//do something
finish();
}else{
loadingSpinner.setVisibility(View.GONE);
//Show alert
}
}
}
[...]
AsyncTask postExecuteMethod(boolean executionResult) {
doneLoading(executionResult);
}
[...]
希望这有助于澄清! :)