【问题标题】:Android Async task porgress bar doesn't comes until background process is completed在后台进程完成之前,Android Async 任务进度条不会出现
【发布时间】:2012-02-07 09:50:33
【问题描述】:

我正在构建一个项目,在该项目中我使用异步任务来显示进度条。 我正在使用 get() 方法等待主线程,以便我们可以在之前完成其他任务。

但是在 doInBackground 完成后会显示进度条。 我想在加载开始时显示加载栏。 当 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;
    }
 }}

请帮忙。提前致谢。

【问题讨论】:

  • 所以你想在同步过程中显示一个进度对话框吗?
  • 是不是说明你的对话框显示在onpostexecute方法中了?请问你的后台任务成功了吗?
  • 是的,我的对话框在 onpostexecute 方法中显示,后台任务也成功,我想在同步过程中显示一个对话框
  • 我认为由于 get() 方法,它会阻止所有其他线程同时执行。它正在一个一个地运行。

标签: android progress-bar android-asynctask


【解决方案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();
     }
 }

【讨论】:

  • 不是这个代码,...但是,您需要将同步代码放在我的代码的运行方法中......
  • ok .. 我可以放全班吗??或者如果我这样做,那么我将如何执行异步类
【解决方案2】:

已编辑:在我之前的回答中,我建议使用处理程序;但是,AsyncTask 消除了我没有发现的执行此操作的需要。

为什么你觉得有必要调用 AsyncTask.get()?这是一个阻塞调用,你从 UI 线程调用它,因此它最终是先运行还是 onPreExecute() 运行的竞争条件。

我认为没有理由在这种情况下调用 get()。您想在 AsyncTask 完成后调用 runned(),但您可以通过从 onPostExecute() 启动一个新线程来实现。或者,您可以像现在一样使用 get(),但从新线程而不是 UI 线程调用它。

【讨论】:

  • 我必须调用 get() 因为一些线程并行运行并且一个线程在后台,ui 线程会自行更新,这会产生一个大问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
  • 2020-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多