我正在尝试创建一个运行游戏循环线程的surfaceView,我花了很多时间来解决这个问题,运行了一段时间后,游戏循环似乎很好,它继续运行,并在第一次运行后继续抛出错误,它运行了一段时间,并像它假设的那样绘制,但随后返回null,我已将System.out。println();在多个位置查看某些方法是否正在运行,以及它们运行了多少次(是的,我知道使用日志,但我不太喜欢它们),无论如何,我注意到的是,当我运行应用程序时,它会运行onResume、onPause,然后再次运行onResue,然后在SurfaceView中进行surfacestroyed,应用程序会继续实际绘制,但会不断将NPE放到画布上。我不确定,但我不认为在我不做任何事情的情况下,表面处理程序在运行时应该被调用。这是我所有类的代码,包括Main:
package com.kojense.maverick.projectishgard.game;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Window;
import android.view.WindowManager;
public class Main extends AppCompatActivity {
public static int COUNT = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(new GamePannel(this));
}
@Override
public void onPause(){
super.onPause();
System.out.println("Paused");
}
@Override
public void onResume(){
super.onResume();
System.out.println("Resumed");
}
@Override
public void onStop(){
super.onStop();
System.out.println("Stopped");
}
}
游戏面板:
package com.kojense.maverick.projectishgard.game;
import android.content.Context;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import com.kojense.maverick.projectishgard.R;
/**
* Created by Maverick on 5/2/2017.
*/
public class GamePannel extends SurfaceView implements SurfaceHolder.Callback {
private GameThread thread;
public static int WIDTH, HEIGHT, SPEED = 15;
private HUD hud;
private block b;
public GamePannel(Context context){
super(context);
getHolder().addCallback(this);
thread = new GameThread(getHolder(), this);
setFocusable(true);
}
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
this.WIDTH = getWidth();
this.HEIGHT = getHeight();
hud = new HUD(BitmapFactory.decodeResource(getResources(), R.drawable.b1));
b = new block();
thread.setRunning(true);
thread.start();
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
System.out.println("Destroyed");
}
@Override
public boolean onTouchEvent(MotionEvent e){
return super.onTouchEvent(e);
}
public void update(){
b.update();
}
@Override
public void draw(Canvas canvas){
super.draw(canvas);
canvas.drawColor(Color.WHITE);
b.draw(canvas);
hud.draw(canvas); //Keep at end to stay ontop
}
}
游戏线程:
package com.kojense.maverick.projectishgard.game;
import android.graphics.Canvas;
import android.view.SurfaceHolder;
/**
* Created by Maverick on 5/2/2017.
*/
public class GameThread extends Thread implements Runnable {
public static final int MAX_FPS = 30;
private SurfaceHolder holder;
private GamePannel pannel;
private boolean running = true;
private Canvas canvas;
public GameThread(SurfaceHolder holder, GamePannel pannel){
super();
this.holder = holder;
this.pannel = pannel;
}
public void setRunning(boolean r){ this.running = r;}
@Override
public void run(){
long startTime, waitTime, totalTime = 1000/MAX_FPS;
while(running){
startTime = System.currentTimeMillis();
canvas = null;
try {
canvas = this.holder.lockCanvas();
synchronized (holder) {
this.pannel.update();
this.pannel.draw(canvas);
}
}catch (Exception e){
e.printStackTrace();
} finally{
if(canvas != null) {
try {
holder.unlockCanvasAndPost(canvas);
}catch (Exception e){
e.printStackTrace();
}
}
}
waitTime = totalTime-(System.currentTimeMillis() - startTime);
try{
if(waitTime > 0) {
sleep(waitTime);
} else {
sleep(10);
}
}catch (Exception e){}
}
}
}
错误日志:
05-04 17:05:59.030 3993-4428/com.kojense.maverick.projectishgard D/mali_winsys: new_window_surface returns 0x3000, [2560x1440]-format:1
05-04 17:05:59.070 3993-3993/com.kojense.maverick.projectishgard D/ViewRootImpl: MSG_RESIZED_REPORT: ci=Rect(0, 0 - 0, 0) vi=Rect(0, 0 - 0, 0) or=2
05-04 17:05:59.080 3993-3993/com.kojense.maverick.projectishgard I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@22f318b time:7154875
05-04 17:05:59.080 3993-3993/com.kojense.maverick.projectishgard I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@9eb69c6 time:7154875
05-04 17:05:59.080 3993-3993/com.kojense.maverick.projectishgard V/ActivityThread: updateVisibility : ActivityRecord{b5a4703 token=android.os.BinderProxy@9eb69c6 {com.kojense.maverick.projectishgard/com.kojense.maverick.projectishgard.splash.SplashScreen}} show : false
05-04 17:06:06.890 3993-3993/com.kojense.maverick.projectishgard I/Timeline: Timeline: Activity_launch_request id:com.kojense.maverick.projectishgard time:7162687
05-04 17:06:06.910 3993-3993/com.kojense.maverick.projectishgard I/System.out: Paused
05-04 17:06:06.920 3993-3993/com.kojense.maverick.projectishgard W/ResourcesManager: getTopLevelResources: /data/app/com.kojense.maverick.projectishgard-1/base.apk / 1.0 running in com.kojense.maverick.projectishgard rsrc of package com.kojense.maverick.projectishgard
05-04 17:06:06.930 3993-3993/com.kojense.maverick.projectishgard D/Activity: performCreate Call Injection manager
05-04 17:06:06.930 3993-3993/com.kojense.maverick.projectishgard I/InjectionManager: dispatchOnViewCreated > Target : com.kojense.maverick.projectishgard.game.Main isFragment :false
05-04 17:06:06.930 3993-3993/com.kojense.maverick.projectishgard I/System.out: Resumed
05-04 17:06:06.930 3993-3993/com.kojense.maverick.projectishgard D/SecWifiDisplayUtil: Metadata value : SecSettings2
05-04 17:06:06.930 3993-3993/com.kojense.maverick.projectishgard D/ViewRootImpl: #1 mView = com.android.internal.policy.PhoneWindow$DecorView{8d8c1d6 I.E...... R.....ID 0,0-0,0}
05-04 17:06:06.950 3993-4428/com.kojense.maverick.projectishgard D/mali_winsys: new_window_surface returns 0x3000, [2560x1440]-format:1
05-04 17:06:07.000 3993-3993/com.kojense.maverick.projectishgard D/ViewRootImpl: MSG_RESIZED_REPORT: ci=Rect(0, 0 - 0, 0) vi=Rect(0, 0 - 0, 0) or=2
05-04 17:06:07.020 3993-3993/com.kojense.maverick.projectishgard I/System.out: Destroyed
05-04 17:06:07.030 3993-3993/com.kojense.maverick.projectishgard I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@b9191f1 time:7162823
05-04 17:06:07.100 3993-4456/com.kojense.maverick.projectishgard W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.Canvas.drawColor(int, android.graphics.PorterDuff$Mode)' on a null object reference
05-04 17:06:07.100 3993-4456/com.kojense.maverick.projectishgard W/System.err: at android.view.SurfaceView.dispatchDraw(SurfaceView.java:451)
05-04 17:06:07.100 3993-4456/com.kojense.maverick.projectishgard W/System.err: at android.view.View.draw(View.java:17479)
05-04 17:06:07.100 3993-4456/com.kojense.maverick.projectishgard W/System.err: at android.view.SurfaceView.draw(SurfaceView.java:442)
05-04 17:06:07.100 3993-4456/com.kojense.maverick.projectishgard W/System.err: at com.kojense.maverick.projectishgard.game.GamePannel.draw(GamePannel.java:72)
05-04 17:06:07.100 3993-4456/com.kojense.maverick.projectishgard W/System.err: at com.kojense.maverick.projectishgard.game.GameThread.run(GameThread.java:39)
05-04 17:06:07.270 3993-3993/com.kojense.maverick.projectishgard I/System.out: Stopped
05-04 17:06:07.270 3993-3993/com.kojense.maverick.projectishgard V/ActivityThread: updateVisibility : ActivityRecord{eca5344 token=android.os.BinderProxy@22f318b {com.kojense.maverick.projectishgard/com.kojense.maverick.projectishgard.game.Main}} show : false
编辑:
我发现了我相信的错误,三星设备暂停应用程序并恢复它们,我在朋友的手机上尝试了此代码,他没有暂停错误,然后我在另一台运行最新版本 android 和相同问题的三星设备上尝试了它(当前我正在测试的是运行 M)。我猜什么时候它会破坏表面视图并导致画布变为空。所以我想我只需要弄清楚如何暂停和恢复线程,如果有人想帮助我解决这个问题,也有人知道手机是否这样做并破坏 surfaceview(运行方法 surfacedestroy),如果我需要重新创建表面或只是继续线程(恢复线程)。谢谢大家!
在surfaceDestroyed方法中添加这行代码。
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
boolean retry= true;
thread.setRunning(false);
while(retry){
try{
thread.join();
retry=false;
}catch(InterruptedException e){
Log.e("GamePannel","Exception in surfaceDestroyed",e);
}
}
}
我有带oauth2安全mySql数据库连接和一些控制器的Spring Boot应用程序。我已经在AWS服务器上部署了它,它工作得很好,但它在一段时间后关闭了,它没有得到很多API调用,所以没有理由DDOS失败或outOfMemmory错误,我可以在日志中看到以下消息 2018-10-28 10:58:55.979信息1253---[线程-3]ConfigServletWebServerApplic
我们有一个具有Ha all策略的2节点RabbitMQ集群。我们在应用程序中使用Spring AMQP与RabbitMQ对话。生产者部分工作正常,但消费者工作了一段时间并暂停。生产者和消费者作为不同的应用程序运行。更多关于消费者部分的信息。 我们将与一起使用,使用手动模式和默认 在我们的应用程序中,我们创建队列(按需)并将其添加到侦听器中 当我们从10个和20个开始时,消费大约持续15个小时并暂停
问题内容: 我正在使用Android的软件包来开发包含多个的ViewPager 。 我正在尝试在用户更改页面时隐藏视图。因此,我实现了一个来监听适配器,并在发生页面更改时在s中调用一个方法。但是我得到了,我不知道为什么。 这是代码: 和 w当我复制/粘贴时,我删除了方法,但是它们在那里。该方法记录if ,并且始终返回false。当我寻呼时,被调用并返回true。为什么会发生这种情况,我该如何解决?
问题内容: 我想创建一个服务,该服务会在10秒钟后反复运行一种方法,直到我将其停止为止,即使该应用已关闭也是如此。我的尝试代码如下 这就是我启动服务的方式。 该程序立即停止运行;如何更改代码以获得所需的行为? 问题答案: 创建一个广播接收器,在接收到来自以下站点的广播后,它将启动您的服务: 当您启动应用程序时,第一次启动广播接收器: 还将其添加到清单文件中: 如果您希望在资源可用时立即由Andro
我有一个使用Activity认可的Detected活动广播接收器。我注意到它确实连接了,但我没有得到任何数据。这是在三星Note 2上。在其他手机上,我尝试过它总是有效的。这是连接到谷歌api的代码: 这是请求动作的代码: 其中“GetActivityDetectionPendingContent”是: 奇怪的是,我然后重新启动了手机。进入应用程序,重新启动后,我只是稍微摇晃了一下手机,开始获取位
更新06/04这里是消费者出厂设置。它是Spring-Kafka-1.3.1。Kafka经纪人合流版 注意:容器工厂已将自动启动设置为false。这是在加载大文件时手动启动/停止使用者。 运行大约1小时后(时间不同),使用者停止使用来自其主题的消息,即使该主题有许多可用消息。Consumer方法中有一个log语句,用于停止在日志中打印。 我们如何设计Spring-Kafka消费者,使其在停止消费的