Intent putExtra位图问题

时间:2016-07-29 13:58:58

标签: android

我有以下代码:

   ((ImageButton)findViewById(R.id.fish)).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(StartupActivity.this, GameActivity.class);
            intent.putExtra(NAME_EXTRA, ((EditText)findViewById(R.id.name)).getText().toString().trim());
            intent.putExtra(TYPE_EXTRA, FishTypes.FISH.toString());
            intent.putExtra(WORLD_TYPE_EXTRA, worldType);
            intent.putExtra(LOGO_EXTRA, BitmapFactory.decodeResource(getResources(), R.drawable.logo));
            startActivity(intent);
        }
    });

如果我开始活动并点击ImageButton,它会将我发送到我之前的相同活动(StartupActivity)。但是,如果我像这样注释掉最后一个putExtra:

//intent.putExtra(LOGO_EXTRA, BitmapFactory.decodeResource(getResources(), R.drawable.logo));

然后它工作正常。它会根据需要将我发送到GameActivity。可能是什么问题?

修改

我的GameActivity看起来像这样:

public class GameActivity extends Activity {

public static GamePanel gamePanel;
public static String name;
public static FishTypes type;
public static String worldType;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    requestWindowFeature(getWindow().FEATURE_NO_TITLE);

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);


    name = getIntent().getStringExtra(StartupActivity.NAME_EXTRA);
    type = FishTypes.parse(getIntent().getStringExtra(StartupActivity.TYPE_EXTRA));
    worldType = getIntent().getStringExtra(StartupActivity.WORLD_TYPE_EXTRA);

    gamePanel = new GamePanel(this);
    //gamePanel.bitmaps.put("logo", (Bitmap)getIntent().getParcelableExtra(StartupActivity.LOGO_EXTRA));
    setContentView(gamePanel);

    if(!StartupActivity.isNetworkAvailable()) {
        Toast.makeText(StartupActivity.getInstance(), "You have no internet connection...", Toast.LENGTH_LONG).show();
        finish();
    }
}

@Override
protected void onDestroy() {
    if(gamePanel.client != null)
        gamePanel.client.disconnect();
    StartupActivity.getInstance().reopen();
    super.onDestroy();
}
}

我想要实现的是在StartupActivity中预加载此位图,然后将其发送到GameAnel到GamePanel,然后在画布上将其作为加载图像绘制。我无法在GameActivity中加载此图像,因为显示它会迟到。你明白了吗?

1 个答案:

答案 0 :(得分:0)

首先,有Intent个有效负载限制,据我所知有 1MB 的限制,但在某些情况下可以 500kb 。如果超出此限制,应用程序将崩溃,在您的情况下崩溃并重新启动。

其次,BundleIntent用于将少量数据发送到ActivityFragments,通常是一些配置/参数,以便活动/片段会知道如何建立自己。

第三,传递位图实例是一种非常糟糕的做法,只需要一秒钟的注意力就可以在你的应用程序中造成巨大的泄漏,这会花费你很多时间来查找和修复它。

现在,您的解决方案非常简单。您可以在下一个活动中传递要使用的位图的id

 Intent intent = new Intent(StartupActivity.this, GameActivity.class);
        intent.putExtra(NAME_EXTRA, ((EditText)findViewById(R.id.name)).getText().toString().trim());
        intent.putExtra(TYPE_EXTRA, FishTypes.FISH.toString());
        intent.putExtra(WORLD_TYPE_EXTRA, worldType);
        intent.putExtra(LOGO_EXTRA,  R.drawable.logo); // R.drawable.logo is actually an int.
        startActivity(intent);

GameActivity

    @Override
public void onCreate(Bundle savedInstanceState) {
    setContentView(...)
    int myAwesomeDrawable = getIntent().getExtra(LOGO_EXTRA, 0); // 0 is default value in case nothing is added to the key
    if(myAwesomeDrawable != 0){ // safety check
      imageView.setImageResource(myAwesomeDrawable);
      // or do whatever you like with it.
    }