2012-02-07 5 views
0

Я создаю проект, в котором я использую async задачу, чтобы показать индикатор выполнения. Я использую метод get(), чтобы подождать основного потока, чтобы мы могли выполнить другую задачу раньше.Android Async задает пороговую панель не до тех пор, пока фоновый процесс не завершится

но индикатор выполнения отображается после завершения 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; 
    } 
}} 

Помогите. Заранее спасибо.

+0

так что вы хотите, чтобы отобразить диалог прогресса во время процесса синхронизации справа? – Lucifer

+0

Означает ли это, что ваше диалоговое окно отображается в методе onpostexecute? –

+0

Да, мой диалог отображается в методе onpostexecute, и фоновая задача также успешна, и я хочу отобразить диалоговое окно при процессе синхронизации. –

ответ

1

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

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

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

+0

где я должен вставлять этот код? и что это будет делать? –

+0

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

+0

Я отредактировал свой ответ, поскольку это было ранее не актуально. –

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

где я должен вставлять этот код? –

+0

не этот код, ... однако вам нужно поместить ваш синхронизирующий код в метод запуска моего кода .... – Lucifer

+0

ok .. могу ли я поставить весь класс ?? или если я это сделаю, то как я буду запускать класс async –

Смежные вопросы