使用 AsyncTask.execute().get() 显示 ProgressBar
show ProgressBar with AsyncTask.execute().get()
我想在 运行 我的 Asynctask 中的代码中显示不确定的 ProgressBar,但是(如果我是对的)因为我在 MainActivity 中使用 .get() 函数 UI-线程冻结,直到 AsyncTask 给出响应,因此不会显示 ProgressBar。当 UI-thread 正在等待 Asynctask 完成和 return 一些值时,我怎样才能使 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);
}}
尝试 运行 AsyncTask
没有 .get()
。
您可以使用接口(see original answer):
您的界面:
public interface OnTaskCompleted{
void onTaskCompleted();
}
你的Activity:
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();
然后只需在 CustomAsyncTask
中更新 .onPostExecute()
中的 message
:
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);
}
我想在 运行 我的 Asynctask 中的代码中显示不确定的 ProgressBar,但是(如果我是对的)因为我在 MainActivity 中使用 .get() 函数 UI-线程冻结,直到 AsyncTask 给出响应,因此不会显示 ProgressBar。当 UI-thread 正在等待 Asynctask 完成和 return 一些值时,我怎样才能使 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);
}}
尝试 运行 AsyncTask
没有 .get()
。
您可以使用接口(see original answer):
您的界面:
public interface OnTaskCompleted{
void onTaskCompleted();
}
你的Activity:
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();
然后只需在 CustomAsyncTask
中更新 .onPostExecute()
中的 message
:
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);
}