繁体   English   中英

通过Eventbus Android在活动之间传递大型对象

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM