2013-01-25 18 views
5

私のアプリケーションにログインアクティビティがあり、インターネットのWebサイトから資格情報をチェックしています。 これを行うには、AsyncTaskクラスを使用する必要があります。 ログインに成功すると、グローバル変数がtrueに設定されます。AsyncTaskのイベントが終了しました

これは非同期なので、アクティビティは結果を待たず、AsyncTaskクラスのポスト実行メソッドによって発生するイベントを追加したいと思います。 ログインアクティビティのlistenerが自動的に閉じられ、メインアクティビティが表示されます。

これが可能かどうか、それがどのように可能かを知りたいと思います。 私は他の投稿からいくつかの例を試しましたが、それらからそれを理解することはできません。

私は次のことを行う必要があると思う: - AsyncTaskクラス でinterfaceを作成 - そのクラスのpost_execute方法から、私はイベントを発生させるが、どのように? - ログインアクティビティにlistenerを入れてください。

ご了承ください。

よろしく、 エリック

+1

バック。 –

+0

あなたは 'Handler'を試しましたか?そうでない場合は、一度お試しください。 –

答えて

5

私はAsyncTaskクラスのポストexecuteメソッドによって発射されたイベントを追加したいと思います。次に、ログインアクティビティのリスナが閉じられ、メインアクティビティが表示されます。

は既にコールバックですが、説明したように別のコールバックを作成できますが、不要です。あなたのAsyncTaskにあなたのログインアクティビティのリファレンスを渡すだけで、それを使ってfinish()startActivity()onPostExecute()に呼んでください。まず

2

、次のようにAsynctaskまたはIntentServiceを使用して、あなたのポストのクラスを作成します...秒で

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

、ポストが終了意図を受け取る(BroadcastReceiver拡張)あなたのクラスを作成します。

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

このサービスをマニフェストファイルに登録します。

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

このレシーバーをあなたの主な活動のonCreateに登録してください。

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

メインアクティビティで以下のメソッドを実装します。

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

あなたのメインアクティビティのonDestroyでこの受信者を登録解除してください。

unregisterReceiver(receiver); 

最後に、ログインアクティビティで転送を実行します。あなたも `現在の1が行き)、専用のログイン活動を行うタスクが完了すると、次に待っているユーザーを保つのどちらか(新しい活動や`仕上げを起動することができますが、あなたは簡単に、このためのBroadcastReceiverを作成することができます

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

ありがとうございます。しかし、私はこれは私の頭の上に今少し考えています。 – Eric

関連する問題