Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Async task porgress bar没有';t直到后台处理完成_Android_Progress Bar_Android Asynctask - Fatal编程技术网

Android Async task porgress bar没有';t直到后台处理完成

Android Async task porgress bar没有';t直到后台处理完成,android,progress-bar,android-asynctask,Android,Progress Bar,Android Asynctask,我正在构建一个项目,其中我使用异步任务来显示进度条。 我正在使用get()方法等待主线程,以便我们可以在之前执行其他任务 但进度条是在完成doInBackground thered后显示的。 我想在加载开始时显示加载条。 当onPostExecute调用时,它将关闭 public class TempConverterActivity extends Activity { pojo p; @Override public void onCreate(Bundle savedInstance

我正在构建一个项目,其中我使用异步任务来显示进度条。 我正在使用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;
    }
 }}
公共类TempConverterActivity扩展活动{
pojop;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
按钮b=(按钮)findViewById(R.id.btn);
b、 setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
showResult();
}
});  
}
私有void showResult(){
试一试{
新建LoadData().execute().get();
}捕获(例外e){
e(“async brix--”,e.getMessage());
}  
runned();
}
私有void runned(){
ArrayList al=p.getData();
for(字符串str:al){
Toast.makeText(getApplicationContext(),str,Toast.LENGTH_SHORT).show();
}
}
私有类LoadData扩展异步任务{
private final ProgressDialog=新建ProgressDialog(TempConverterActivity.this);
受保护的void onPreExecute(){
setMessage(“加载数据…”);
对话框。setUndeterminate(true);
对话框。可设置可取消(false);
dialog.show();
}
受保护的void onPostExecute(最终未使用的void){
if(dialog.isShowing()){
dialog.dismise();
}           
}
@凌驾
受保护的Void doInBackground(Void…参数){
p=新的pojo();
新SoapParser(p);
返回null;
}
}}

请帮忙。提前感谢。

编辑:在我之前的回答中,我建议使用处理程序;然而,AsyncTask消除了我没有发现的需要

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


我看不出有什么理由在这个上下文中调用get()。您希望在AsyncTask完成后调用runned(),但可以通过从onPostExecute()启动新线程来实现。或者,您也可以像现在一样使用get(),但从新线程而不是UI线程调用它。

您可以尝试以下代码

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();
     }
 }

所以,您想在同步过程中显示进度对话框,对吗?这是否意味着您的对话框显示在onpostexecute方法中?Ad您的后台任务成功了吗?是的,我的对话框显示在onpostexecute方法中,后台任务也成功了,我想在同步过程中显示一个对话框我认为是由于get()方法它阻止所有其他thred同时执行。它正在一个接一个地运行。不是这个代码,。。。不过,您需要将同步代码放在我的代码的run方法中…好的。。我能把全班都放进去吗??或者如果我这样做了,那么我将如何执行异步classI必须调用get(),因为有些线程并行运行,后台只有一个线程,ui线程会自动更新,这会造成一个大问题。