2016-05-10 4 views
0

ボタンをクリックしてからアクティビティが時間内に再登録できなかったため、ある時間(約5秒)待ってから画面が回転してしまう可能性はありますか? 私はそれを作り出すことができたと信じています。しかし、それは50試行から1のようでした。画面を回転させている間に投稿が失われることはありますか?

import android.os.Bundle; 
import android.os.Handler; 
import android.os.HandlerThread; 
import android.util.Log; 
import android.widget.Button; 
import android.widget.TextView; 

import org.greenrobot.eventbus.EventBus; 
import org.greenrobot.eventbus.Subscribe; 

import butterknife.BindView; 
import butterknife.ButterKnife; 
import butterknife.OnClick; 

public class MainActivity extends BaseActivity { 

    @BindView(R.id.post) 
    Button mPost; 

    @BindView(R.id.result) 
    TextView mResult; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ButterKnife.bind(this); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     EventBus.getDefault().register(this); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     EventBus.getDefault().unregister(this); 
    } 

    @OnClick(R.id.post) 
    void onPostClick() { 

     HandlerThread handlerThread = new HandlerThread("MyThread"); 
     handlerThread.start(); 
     Handler handler = new Handler(handlerThread.getLooper()); 

     handler.post(new Runnable() { 
      @Override 
      public void run() { 
       Log.e(TAG, Thread.currentThread().getName()); 
       try { 
        Thread.sleep(5000); 
        EventBus.getDefault().post(new MyObject("wow")); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 


    } 

    @Subscribe(threadMode = ThreadMode.MAIN) 
    public void onResult(MyObject object) { 
     Log.e(TAG, "POST " + object); 
    } 

    static class MyObject { 
     String val; 

     public MyObject(String val) { 
      this.val = val; 
     } 

     @Override 
     public String toString() { 
      return val; 
     } 
    } 
} 
+1

を復元します。アクティビティが再開されるためです。これはAndroidプログラミングのABCです。 –

答えて

1

チャンスがありますレクリエーションのためにアクティビティコードがイベントを逃すことがありますが、問題が発生した場合はイベントを投稿する必要がありますstickyとして:

一部のイベントは、イベントが が掲載された後、興味のある情報を運びます。たとえば、ある初期化が 完了したことをイベントが通知します。または、センサまたは位置データがあり、最新の値を保持する場合は とします。独自の キャッシングを実装する代わりに、スティッキーなイベントを使用できます。 EventBusは、特定タイプの最後のsticky イベントをメモリに保持します。スティッキーイベントは、サブスクライバに を配信するか、明示的に問い合せることができます。したがって、すでに利用可能なデータを検討するために特別な ロジックは必要ありません。

http://greenrobot.org/eventbus/documentation/configuration/sticky-events/

また、いくつかはonCreate/onDestroyonStart/onStopから取り扱い登録を動かす示唆しています。私は悪いアイデアだと思う - あなたはバックグラウンドにいる場合、通常イベントを気にしないので、代わりにonResume/にreg/unregコードを移動することをお勧めします。

0

あなたのデバイスが回転している間、あなたのアクティビティが再現されます。あなたはマニフェストのような属性を設定することができます。 android:configChanges="orientation|keyboardHidden|screenSize"

+0

ちょっとハッキリです。 – Guliash

-1

あなたはないonStartonStopではなく、onCreateonDestroy RESPでリスナーを解除/ subsribeする必要があります。また、mainスレッドにイベントを投稿してください。この場合、ギャップは無くなり、調整された場合、新しい活動がイベントを受け取ります

+0

ありがとうございます。私は間違いを見る。 @Subscribe(threadMode = ThreadMode.MAIN)を追加します。 – Guliash

0

あなたがしなければならないことは、onSaveInstanceState()メソッドを使用してアクティビティを再作成することです。

static final String STATE_SCORE = "playerScore"; 
static final String STATE_LEVEL = "playerLevel"; 
... 

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
// Save the user's current game state 
savedInstanceState.putInt(STATE_SCORE, mCurrentScore); 
savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel); 

// Always call the superclass so it can save the view hierarchy state 
super.onSaveInstanceState(savedInstanceState); 
} 

あなたの活動状態を保存あなたの活動状態はもちろん、はい

@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); // Always call the superclass first 

// Check whether we're recreating a previously destroyed instance 
if (savedInstanceState != null) { 
    // Restore value of members from saved state 
    mCurrentScore = savedInstanceState.getInt(STATE_SCORE); 
    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); 
} else { 
    // Probably initialize members with default values for a new instance 
} 
... 
} 
関連する問題