Android 额外位图问题

Android 额外位图问题,android,Android,我有以下代码: ((ImageButton)findViewById(R.id.fish)).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(StartupActivity.this, GameActivity.class); in

我有以下代码:

   ((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)。但是,如果我这样评论最后一句话:

//intent.putExtra(LOGO_EXTRA, BitmapFactory.decodeResource(getResources(), R.drawable.logo));
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();
}
}
那么它工作得很好。它会按我的意愿将我发送到游戏活动。有什么问题吗

编辑

我的游戏活动如下所示:

//intent.putExtra(LOGO_EXTRA, BitmapFactory.decodeResource(getResources(), R.drawable.logo));
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中预加载此位图,然后将其发送到GameActivity的GamePanel,然后将其作为加载图像绘制在画布上。我无法在GameActivity中加载此图像,因为显示它将很晚。你明白吗?

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

其次,
Bundle
Intent
用于向
活动
片段
发送少量数据,通常一些配置/参数使活动/片段知道如何构建自身

第三,传递位图实例是一种非常糟糕的做法,你只需要一秒钟的分心就可以在你的应用程序中造成一个巨大的漏洞,这将花费你大量的时间来发现和修复它

现在,您的解决方案非常简单。您可以传递要在下一个活动中使用的位图的
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);
在您的
游戏活动中

    @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.
    } 

BitmapFactory.decodeResource(getResources(),R.drawable.logo)不需要。您可以在全局级别访问应用程序中的drawable,您能告诉我如何访问吗?您想在GameActivity.class中使用徽标吗?请将游戏活动放在此处除了使用BitmapFactory外,最好将drawable作为整数传递。。意向。额外(标志额外,R.可绘制。标志);几乎和我以前写的一样。在我意识到之前,无论如何都可以在目标活动中访问R.drawable.logo。这就是为什么你根本不需要把这个标志作为额外的东西来传递。但是我需要它在StartupActivity中预加载。。。这个答案是错误的。我不想在GameActivity中加载它,因为加载它需要时间,而且应该是加载图像。明白吗?@duri从资产中加载图像几乎不需要时间。