【问题标题】:show ProgressBar with AsyncTask.execute().get()使用 AsyncTask.execute().get() 显示 ProgressBar
【发布时间】:2018-08-29 22:56:57
【问题描述】:

我想在我的 Asynctask 中运行代码时显示一个不确定的 ProgressBar,但是(如果我是对的)因为我在 MainActivity 中使用 .get() 函数,所以 UI 线程会冻结,直到 AsyncTask 给出响应因此不会显示 ProgressBar。当 UI 线程正在等待 Asynctask 完成并返回一些值时,如何使 ProgressBar 出现在屏幕上?

主活动

public class MainActivity extends AppCompatActivity {
ProgressBar progressBar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    progressBar = (ProgressBar) findViewById(R.id.progressBar);
}

public void showSpinner(View view){
    CustomAsyncTask customAsyncTask = new CustomAsyncTask(this);
    customAsyncTask.setProgressBar(progressBar);
    try {
        String message = customAsyncTask.execute().get();
    } catch (ExecutionException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    Toast.makeText(this,
            "Time is up", Toast.LENGTH_LONG).show();
}}

异步任务

public class CustomAsyncTask extends android.os.AsyncTask<Void, Void, String> {

Context context;
CustomAsyncTask(Context ctx) {
    context = ctx;
}

ProgressBar progressBar;
public void setProgressBar(ProgressBar progressBar) {
    this.progressBar = progressBar;
}

@Override
protected String doInBackground(Void... voids) {
    SystemClock.sleep(2000);
    String message = "hello world";
    return message;
}

@Override
protected void onPreExecute() {
    progressBar.setVisibility(View.VISIBLE);
}

@Override
protected void onPostExecute(String message) {
    progressBar.setVisibility(View.GONE);
}}

【问题讨论】:

    标签: android-asynctask android-progressbar


    【解决方案1】:

    尝试在没有.get() 的情况下运行AsyncTask

    您可以使用界面(see original answer):

    你的界面:

    public interface OnTaskCompleted{
        void onTaskCompleted();
    }
    

    您的活动:

    public MainActivity extends AppCompatActivity implements OnTaskCompleted{
        //your MainActivity
    }
    

    还有你的 AsyncTask:

    public class CustomAsyncTask extends android.os.AsyncTask<Void, Void, String> {
        private OnTaskCompleted listener;
    
        public CustomAsyncTask(OnTaskCompleted listener){
            this.listener=listener;
        }
    
        //required methods
    
        protected void onPostExecute(Object o){
            //your stuff
            listener.onTaskCompleted();
        }
    }
    

    另一种方法是在MainActivity 中为message 添加setter:

    public class MainActivity extends AppCompatActivity {
    //...
    private String message;
    public void setMessage(String message) {
        this.message = message;
    }
    // ...
    customAsyncTask.execute();
    

    然后只需在.onPostExecute() 中更新messageCustomAsyncTask 中:

    public class CustomAsyncTask extends android.os.AsyncTask<Void, Void, String> {
    //...
    @Override
    protected void onPostExecute(String message) {
        progressBar.setVisibility(View.GONE);
        MainActivity activity = (MainActivity) context;
        activity.setMessage(message);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-14
      • 1970-01-01
      相关资源
      最近更新 更多