在任务运行时显示ProgressBar

时间:2018-11-19 16:24:18

标签: java android android-asynctask

我试图仅在任务运行时显示进度条,这是我的代码

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
        }
    }

问题是,当我第一次更改可见性时,什么也没发生。我想念什么?

3 个答案:

答案 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);
}
[...]

希望这有助于澄清! :)