[英]Passing large objects between activities through eventbus android
我是EventBus的新手 。 我想將byteArray
傳遞到下一個活動,我不想使用byteArray
因為byteArray
很大,我最終會byteArray
內存不足的錯誤。 我想通過eventbus
傳遞它。
在實現事件總線時,出現一個異常,說No subscribers registered for event class com.saikirans.eventbuspractise.MessageEvent
。
提前致謝。
MainActivity類:
public class MainActivity extends AppCompatActivity {
Intent intent;
Button button;
byte[] byteArray;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.screen);
intent = new Intent(this, ReceiverActivity.class);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.PNG, 100, stream);
byteArray = stream.toByteArray();
intent.putExtra("bitmap", byteArray);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(intent);
EventBus.getDefault().post(new MessageEvent("Hello everyone!"));
}
});
}
}
ReceiverActivity .class
public class ReceiverActivity extends AppCompatActivity {
ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_reciver);
byte[] byteArray = getIntent().getByteArrayExtra("bitmap");
Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
imageView = (ImageView) findViewById(R.id.imageView);
assert imageView != null;
imageView.setImageBitmap(bitmap);
}
// This method will be called when a MessageEvent is posted
@Subscribe
public void onMessageEvent(MessageEvent event){
Toast.makeText(this, event.message, Toast.LENGTH_SHORT).show();
}
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
}
MessageEvent類:
public class MessageEvent {
public final String message;
public MessageEvent(String message) {
this.message = message;
}
}
您沒有收到事件,因為ReceiverActivity
尚未注冊為EventBus訂閱者。 這是因為通過以下代碼通過意圖啟動ReceiverActivity時:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(intent); // Here you start the intent.
EventBus.getDefault().post(new MessageEvent("Hello everyone!"));
}
});
您的ReceiverActivity
仍處於onCreate()
狀態。 但是它以onStart()
狀態注冊自己:
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
因此,您在ReceiverActivy
准備好接受之前發送消息Event。
解
一個簡單的解決方案是在ReceiverActivity
准備接收消息時通知MainActivity
。 創建ReceiverActivity后,發送消息“事件”。
首先創建一個告訴ReceiverActivity准備就緒的事件:
public class ReceiverReadyEvent() {
public ReceiverReadyEvent();
}
在ReceiverActivity中的onCreate()或onStart()中發送消息:
public class ReceiverActivity extends AppCompatActivity {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
EventBus.getDefault().post(new ReceiverReadyEvent());
}
}
然后在MainActivity中,當您收到ReceiverReadyEvent
(已創建ReceiverActivity)時,發送MessageEvent
:
public class MainActivity extends AppCompatActivity {
// This method will be called when ReceiverActivity is ready to receive MessageEvent
@Subscribe
public void onMessageEvent(ReceiverReadyEvent event){
// Send message to ReceiverActivity.
EventBus.getDefault().post(new MessageEvent("Hello everyone!"));
}
}
對於每個遇到錯誤的人:
沒有訂閱者注冊事件類com。 。
盡管已使用以下代碼注冊和注銷了EventBus:
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
這是因為應該接收消息的活動不在前台。 當活動在另一個活動之后時,它將調用其onStop()方法。 因此,我們結束了注銷EventBus的工作。
為了克服這個問題,我們應該在onCreate()中注冊EventBus並在onDestroy()中注銷:
// Registering
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
EventBus.getDefault().post(new ReceiverReadyEvent());
}
// Unregistering
@Override
public void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
僅當我們完成活動時,它才會注銷EventBus。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.