簡體   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