Java 在任务运行时显示ProgressBar

Java 在任务运行时显示ProgressBar,java,android,android-asynctask,Java,Android,Android Asynctask,我试图只在任务运行时显示进度条,这是我的代码 public void onButtonPressed() { //loadingSpinner is a ProgressBar already instantiated whit visibility GONE; loadingSpinner.setVisibility(View.VISIBLE); boolean resultFromAsyncTask = AnotherClass.AsyncTa

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

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

问题是,当我第一次更改可见性时,什么都没有发生。我缺少什么?

您调用异步任务,但却像使用常规函数一样使用它。您不能基于这样的异步任务的结果,代码将直接在其上运行并执行下一行。
您想要的是显示进度条,然后在不返回的情况下开始任务。您需要类似于onPostExecute中的广播这样的东西来回调调用类,让它知道调用何时完成。

编辑**在这种情况下,由于bool默认为false,它将在if语句中使用该值,并在显示时将其隐藏。

您调用异步任务,但将其作为常规函数使用。您不能基于这样的异步任务的结果,代码将直接在其上运行并执行下一行。
您想要的是显示进度条,然后在不返回的情况下开始任务。您需要类似于onPostExecute中的广播这样的东西来回调调用类,让它知道调用何时完成。

编辑**在这种情况下,由于bool默认为false,它将在if语句中使用该值,并在显示时将其隐藏。

不要使事情过于复杂,
AsyncTask
具有完成此任务所需的所有方法

设置
loadingSpinner.setVisibility(View.VISIBLE)在AsyncTask的
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);
    }

}
私有类YourTask扩展AsyncTask{
@重写受保护的void onPreExecute(){
loadingSpinner.setVisibility(View.VISIBLE);
} 
@凌驾
受保护的字符串doInBackground(字符串…参数){
//做背景工作
}
@重写受保护的void onPostExecute(字符串结果){
loadingSpinner.setVisibility(View.GONE);
}
}

不要让事情过于复杂,
AsyncTask
拥有完成此任务所需的所有方法

设置
loadingSpinner.setVisibility(View.VISIBLE)在AsyncTask的
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);
    }

}
私有类YourTask扩展AsyncTask{
@重写受保护的void onPreExecute(){
loadingSpinner.setVisibility(View.VISIBLE);
} 
@凌驾
受保护的字符串doInBackground(字符串…参数){
//做背景工作
}
@重写受保护的void onPostExecute(字符串结果){
loadingSpinner.setVisibility(View.GONE);
}
}

在@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);
}
[...]

希望这有助于澄清!:)

在@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);
}
[...]

希望这有助于澄清!:)

这似乎是最简单的方法,我尝试过,但没有成功。微调器仅在onPostExecute阶段可见(我在setVisibility(View.GONE)之前添加了一个Thread.sleep来查看它)@NicolasP请更新您的问题并提供您的代码,说明您是如何实现它的。这似乎是最简单的方法,我尝试过,但不起作用。微调器仅在onPostExecute阶段可见(我在setVisibility(View.go)之前添加了一个Thread.sleep来查看它)@NicolasP请更新您的问题并提供您的代码,说明您是如何实现它的。