我正在构建一个项目,其中我使用异步任务来显示进度条。 我使用get()方法等待主线程,所以我们可以在之前完成其他任务。
但是在doInBackground thered完成后会显示进度条。 我想在加载开始时显示加载栏。 它会在onPostExecute调用时解除。
public class TempConverterActivity extends Activity {
pojo p;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button b= (Button) findViewById(R.id.btn);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showResult();
}
});
}
private void showResult() {
try {
new LoadData().execute().get();
} catch (Exception e) {
Log.e("async brix--", e.getMessage());
}
runned();
}
private void runned() {
ArrayList<String> al = p.getData();
for (String str : al){
Toast.makeText(getApplicationContext(), str, Toast.LENGTH_SHORT).show();
}
}
private class LoadData extends AsyncTask<Void, Void, Void> {
private final ProgressDialog dialog = new ProgressDialog(TempConverterActivity.this);
protected void onPreExecute() {
dialog.setMessage("Loading data...");
dialog.setIndeterminate(true);
dialog.setCancelable(false);
dialog.show();
}
protected void onPostExecute(final Void unused) {
if (dialog.isShowing()) {
dialog.dismiss();
}
}
@Override
protected Void doInBackground(Void... params) {
p = new pojo();
new SoapParser(p);
return null;
}
}}
请帮忙。提前谢谢。
答案 0 :(得分:1)
已编辑:在我之前的回答中,我建议使用处理程序;但是,AsyncTask消除了我没有发现的需要。
为什么你觉得需要调用AsyncTask.get()?这是一个阻塞调用,你可以从UI线程调用它,因此它最终是一个竞争条件,无论是首先运行它还是onPreExecute()。
我认为没有理由在这种情况下调用get()。您希望在AsyncTask完成后调用runned(),但您可以通过从onPostExecute()启动新线程来执行此操作。或者你可以像现在一样使用get(),但是从新线程而不是UI线程调用它。
答案 1 :(得分:1)
您可以尝试以下代码,
progDailog = ProgressDialog.show(loginAct,"Process ", "please wait....",true,true);
new Thread ( new Runnable()
{
public void run()
{
// your code goes here
}
}).start();
Handler progressHandler = new Handler()
{
public void handleMessage(Message msg1)
{
progDailog.dismiss();
}
}