Панель задач Android Async не появляется, пока не завершится фоновый процесс - PullRequest
0 голосов
/ 07 февраля 2012

Я строю проект, в котором я использую асинхронную задачу, чтобы показать индикатор выполнения.Я использую метод 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;
    }
 }}

Пожалуйста, помогите.Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 07 февраля 2012

Вы можете попробовать следующий код,

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();
     }
 }
1 голос
/ 07 февраля 2012

Отредактировано: В моем предыдущем ответе я предложил использовать обработчик; однако AsyncTask устраняет необходимость делать это, чего я не заметил.

Почему вы чувствуете необходимость вызвать AsyncTask.get ()? Это блокирующий вызов, и вы вызываете его из потока пользовательского интерфейса, таким образом, в конечном итоге это условие состязания относительно того, запускается ли он или onPreExecute () первым.

Я не вижу причин, почему вы должны вызывать get () в этом контексте. Вы хотите вызвать runned () после завершения AsyncTask, но вы можете сделать это, запустив новый поток из onPostExecute (). В качестве альтернативы вы можете сделать то же, что и сейчас, используя get (), но вызывать это из нового потока вместо потока пользовательского интерфейса.

...