[英]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.