我有以下代码:
((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中加载此图像,因为显示它会迟到。你明白了吗?
答案 0 :(得分:0)
首先,有Intent
个有效负载限制,据我所知有 1MB 的限制,但在某些情况下可以 500kb 。如果超出此限制,应用程序将崩溃,在您的情况下崩溃并重新启动。
其次,Bundle
和Intent
用于将少量数据发送到Activity
和Fragments
,通常是一些配置/参数,以便活动/片段会知道如何建立自己。
第三,传递位图实例是一种非常糟糕的做法,只需要一秒钟的注意力就可以在你的应用程序中造成巨大的泄漏,这会花费你很多时间来查找和修复它。
现在,您的解决方案非常简单。您可以在下一个活动中传递要使用的位图的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.
}