为啥我的应用程序在从自定义视图启动 Activity 后关闭?
Posted
技术标签:
【中文标题】为啥我的应用程序在从自定义视图启动 Activity 后关闭?【英文标题】:Why is my application closing after starting Activity from custom View?为什么我的应用程序在从自定义视图启动 Activity 后关闭? 【发布时间】:2018-03-04 22:35:28 【问题描述】:我正在 android Studio 中开发一个简单的游戏,我正在调用 GameOver 活动,并使用“重试”按钮形成游戏活动(刚刚命名为 MainActivity)。当主角与其中一个怪物发生碰撞时会调用它。我的问题是,当我尝试通过((Activity)getContext()).finish();
完成时,我的应用程序关闭而不是开始新活动。这是启动它的方法:
public void isCharacterDead()
for (Monster item : monsters)
if (characters.get(0).deadCollision.contains(item.collision.centerX(), item.collision.centerY()))
player.stop();
long gameOverDelayEnd = (System.nanoTime()/1000000)+1000;
long gameOverDelayStart = System.nanoTime()/1000000;
while(gameOverDelayStart < gameOverDelayEnd)
gameOverDelayStart = System.nanoTime()/1000000;
characters.remove(0);
Intent gameOver = new Intent(getContext(),GameOver.class);
gameOver.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
((Activity)getContext()).finish();
getContext().startActivity(gameOver);
我的 GameOver Activity 是:
public class GameOver extends Activity
private Button tryAgain;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
//removing the title from the screen in order to have empty screen
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
setContentView(R.layout.activity_game_over);
tryAgain = (Button) findViewById(R.id.tryagain);
tryAgain.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
Intent game = new Intent(GameOver.this, MainActivity.class);
GameOver.this.finish();
startActivity(game);
);
现在,如果我不使用((Activity)getContext()).finish();
,它将启动 GameOver 活动,当单击 Try Again 时,我将移动到 Game Activity(MainActivity) 的新实例。但它会通过 GameOver 中的“重试”按钮降低每次新开始时的性能。我想这是由于在最后一个游戏中开始新游戏活动而没有完成它。关于如何避免这种情况的任何建议? android 监视器内没有任何异常(我的 GPU 监视器也被禁用)。
【问题讨论】:
你为什么使用 Intent.FLAG_ACTIVITY_NEW_TASK 以及你的代码是在哪里写的? getContext() 方法是如何工作的? isCharacterDead() 在自定义视图中。在更新精灵位置的每一帧之后调用它。 【参考方案1】:尝试交换这两行:
((Activity)getContext()).finish();
getContext().startActivity(gameOver);
并且在开始活动时不要忘记break
for
循环
编辑:
编辑您的问题添加完整代码后,现在可以清楚地知道原因 你的问题:
您正在从您创建的线程中调用upd
方法,upd
又调用正在完成活动的方法isCharacterDead
,但不允许从除 UI 线程之外的任何线程访问任何 UI 元素.
您可以使用runOnUiThread
修复它:
将启动活动和停止当前的行替换为以下内容:
((Activity)getContext()).runOnUiThread(new Runnable()
@Override
public void run()
Intent gameOver = new Intent(getContext(),GameOver.class);
gameOver.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getContext().startActivity(gameOver);
((Activity)getContext()).finish();
);
【讨论】:
我交换了它们,但它仍然是一样的 - 应用程序自行关闭,没有任何消息或任何东西。如果我没有从 GameOver 每次新开始都完成活动,则模拟器上的性能会损坏,在真实设备上,它甚至会在第 4 次使用时关闭应用程序。如果更清楚,MainActivity 会启动 GameScreen 视图,我在其中调用 GameOver 活动,如问题所示。 如果重要,我的清单如下所示:<activity android:name=".GameActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".MainActivity" android:theme="@android:style/Theme.Translucent"></activity> <activity android:name=".GameOver" android:theme="@android:style/Theme.Translucent" ></activity>
你能发布 logcat 以便我们更好地帮助你
这是 logcat - CLICK 这是在我按照您的答案交换代码之后。 GameOver 活动根本不显示。如果我没有在自定义视图中完成游戏活动,则会显示游戏结束屏幕。
而THIS 是当我没有((Activity)getContext()).finish();
代码行的时候。在 Game Over 活动中第五次点击 Try Again 按钮后,我收到此错误。以上是关于为啥我的应用程序在从自定义视图启动 Activity 后关闭?的主要内容,如果未能解决你的问题,请参考以下文章
为啥从自定义 UIView 向 UIButton 添加子视图不显示添加的子视图?
Django Ajax 403 仅在从自定义 localhost url 发布时