2013-01-25 16 views
5

Moja aplikacja ma działanie logowania i sprawdza poświadczenia za pośrednictwem strony internetowej. Aby to zrobić, muszę (ja) użyć klasy AsyncTask. Po pomyślnym zalogowaniu zmienna globalna ma wartość true.Wystąpienie pożaru na AsyncTask zakończyło się

Ponieważ jest to działanie asynchroniczne, działanie nie będzie czekać na wynik, dlatego chciałbym dodać zdarzenie uruchamiane przez metodę post-execute klasy AsyncTask. Następnie aktywność związana z logowaniem zostanie zamknięta, a główne działanie jest widoczne.

Chciałbym wiedzieć, czy i jak jest to możliwe. Próbowałem niektórych przykładów z innych postów, ale nie mogę się z nich dowiedzieć.

Chyba trzeba wykonać następujące czynności: - stworzyć interface w klasie AsyncTask - z metody tej klasy post_execute, ja podnieść zdarzenie, ale jak? - umieść listener w działaniu logowania, ale jak?

każda pomoc jest doceniana.

Pozdrawiam, Eric

+1

Możesz łatwo stworzyć BroadcastReceiver za to, choć można również dedykowany logowania Aktywny, zachować użytkownikowi czeka następnie po zakończeniu zadania albo uruchomić nową działalność lub 'wykończenie()' aktualna iść plecy. –

+0

Czy próbowałeś 'Handler'? jeśli nie, spróbuj raz. –

Odpowiedz

5

chciałbym dodać zdarzenie, które jest opalane przez post-wykonać metodę klasy AsyncTask. Następnie detektor aktywności logowania się zamknie, a główna aktywność będzie widoczna.

onPostExecute() jest już oddzwonić, można utworzyć kolejną wywołanie zwrotne, jak opisano, ale nie jest to konieczne. Wystarczy przekazać odwołanie dotyczące aktywności logowania do urządzenia AsyncTask, a następnie użyć go do wywołania finish() i startActivity() w onPostExecute().

2

Początkowo utworzyć klasę pocztowy, używając Asynctask lub IntentService jak po ...

public class PostIntentService extends IntentService implements PostTask.Observer { 
    private int counter = 0; 
    private int retry = 2; 
    private Data mData; 

    public PostIntentService() { 
     super("PostIntentService"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     mData = (Data) intent.getSerializableExtra("data"); 
     // send updating status 
     Intent i = new Intent(); 
     i.setAction(PostResponseReceiver.ACTION_RESPONSE); 
     i.addCategory(Intent.CATEGORY_DEFAULT); 
     i.putExtra("status", "updating"); 
     sendBroadcast(i); 
     execute(); 
     counter++; 
    } 

    @Override 
    public void onSuccessPost(String result) { 
     // send success status 
     Intent i = new Intent(); 
     i.setAction(PostResponseReceiver.ACTION_RESPONSE); 
     i.addCategory(Intent.CATEGORY_DEFAULT); 
     i.putExtra("status", "success"); 
     sendBroadcast(i); 
    } 

    @Override 
    public void onFailedPost(String result) { 
     if (counter < retry) { 
      execute(); 
      counter++; 
     } 
     else { 
      // send failed status 
      Intent i = new Intent(); 
      i.setAction(PostResponseReceiver.ACTION_RESPONSE); 
      i.addCategory(Intent.CATEGORY_DEFAULT); 
      i.putExtra("status", "failed"); 
      i.putExtra("data", mData);// for reproduct 
      sendBroadcast(i); 
     } 
    } 
    private void execute() { 
     PostTask task = new PostTask(this); 
     task.execute(); 
    } 
} 

Na sekundę utworzyć klasę (rozszerzony BroadcastReceiver), który odbiera intencję, gdy po zakończeniu.

public class PostBroadcastReceiver extends BroadcastReceiver { 
    public static final String ACTION_RESPONSE = "com.example.android.intent.action.POST_PROCESSED"; 
    private static final int POST_REQUEST = 100; 
    private Observer mObserver; 

    public PostBroadcastReceiver(Observer observer) { 
     mObserver = observer; 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getStringExtra("status").equals("updating")) { 
     } 
     else if (intent.getStringExtra("status").equals("success")) { 
      if (mObserver != null) { 
       mObserver.onPostFinished(); 
      } 
     } 
     else if (intent.getStringExtra("status").equals("failed")) { 
      if (mObserver != null) { 
       mObserver.onPostFailed(); 
      } 
     } 
    } 

    public interface Observer { 
     public void onPostFinished(); 
     public void onPostFailed(); 
    } 
} 

Zarejestruj tę usługę w pliku Manifest.

<service android:name=".PostIntentService" /> 

Zarejestruj tę dostawę w sprawie Utwórz główną działalność.

IntentFilter filter = new IntentFilter(PostBroadcastReceiver.ACTION_RESPONSE); 
filter.addCategory(Intent.CATEGORY_DEFAULT); 
receiver = new PostResponseReceiver(this); 
registerReceiver(receiver, filter); 

I zaimplementuj następującą metodę w swojej głównej działalności.

public void onPostFinished() { 
    Log.d("onPostFinished", "onPostFinished"); 
} 
public void onPostFailed() { 
    Log.d("onPostFailed", "onPostFailed"); 
} 

Nie zapomnij Wyrejestrować tego odbiornika w ramach przejęcia głównej aktywności.

unregisterReceiver(receiver); 

Wreszcie, wykonaj przelew w swojej aktywności logowania.

Intent intent = new Intent(this, PostIntentService.class); 
intent.putExtra("data", mData); 
startService(intent); 
+0

dziękuję. ale teraz myślę, że to trochę ponad moją głowę. – Eric

Powiązane problemy