2017-08-14 5 views
0

シングルトンパターンでコードを書き込もうとしました。アンドロイドスタジオでデバッグしようとするとデータ収集に悩む

これは私のMainActivityです。

public class MainActivity extends AppCompatActivity { 

public static MainActivity activity; 
public TouchSensor touchSensor; 
public SurfaceViewThread surfaceViewThread; 
public TriggerChecker triggerChecker; 

public Physics physics; 

//public static Handler mHandler = new Handler(); 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    activity = this; 
    surfaceViewThread = SurfaceViewThread.getInstance(); 
    touchSensor = TouchSensor.getInstance(); 
    triggerChecker = TriggerChecker.getInstance(); 
    physics = Physics.getInstance(); 

    touchSensor.start(); 
    triggerChecker.start(); 
    physics.start(); 
    //surfaceViewThread is already started. 

    activity.setContentView(surfaceViewThread); 
} 

これはシングルトンパターンで書き込むコードです。

public class SurfaceViewThread extends SurfaceView implements Runnable, SurfaceHolder.Callback { 

private static SurfaceViewThread surfaceViewThread = new SurfaceViewThread(); 

private static Camera camera; 
private SurfaceHolder holder; 
private Thread thread; 
private boolean run; 

private Vector<ObjectGraphic> objects; 
private Vector<Graphic> UIs; 
private ObjectGraphic field; 

private Vector<ObjectGraphic> draws; 
private ComponentMessage componentMessage; 

public static SurfaceViewThread getInstance() 
{ 
    if(surfaceViewThread == null) 
     surfaceViewThread = new SurfaceViewThread(); 
    return surfaceViewThread; 
} 
private SurfaceViewThread() 
{ 
    super(activity.getApplicationContext()); 
    camera = new Camera(); 
    getHolder().addCallback(this); 
    holder = getHolder(); 
    objects = new Vector<>(); 
    UIs = new Vector<>(); 

    draws = new Vector<>(); 

    run = false; 

    componentMessage = new ComponentMessage(); 
} 

このコードを作成すると、CameraクラスがNullPointExceptionによってクラッシュしました。

public class Camera extends GameObject { 

private Rect area; 
private int sight; 
private int maxSight = 50; 
private int minSight = 10; 
private int[] fieldOfView;//{vertical, horizontal} 
private int[] maxFieldOfView = new int[] { 60, 45 }; 
private int[] minFieldOfView = new int[] { 10, 10 }; 

public Camera() 
{ 
    super(); 
    area = new Rect(); 
    this.fieldOfView = new int[] { 60, 45 }; 
    objectMatrix.Rotate(objectMatrix.xVector(), Math.toRadians(-45)); 

    setDisplayVector(); 
} 
private void setSight() 
{ 
    double angle = Math.PI/2 - Math.acos(new Common_Math.Matrix1X4(0, 1, 0, 0).Inner(objectMatrix.zVector().Invert())); 
    if(angle < 0 && angle > - Math.PI/2) { 
     double t = -objectMatrix.qVector().getY()/objectMatrix.zVector().getY(); 
     int x = (int) (objectMatrix.zVector().getX() * t + objectMatrix.qVector().getX()); 
     int z = (int) (objectMatrix.zVector().getZ() * t + objectMatrix.qVector().getZ()); 

     sight = (int)Math.sqrt(Math.pow((x - objectMatrix.qVector().getX()), 2) + Math.pow((objectMatrix.qVector().getY()), 2) + Math.pow((z - objectMatrix.qVector().getZ()), 2)); 
     if(sight < minSight) 
      sight = minSight; 
    } 
    else 
    { 
     sight = maxSight; 
    } 
} 
private void setDisplayVector() 
{ 
    setSight(); 
    Common_Math.Matrix1X4 upVector, downVector, leftVector, rightVector; 
    Common_Math.Matrix1X4 zVector = objectMatrix.zVector(); 

    upVector = zVector.Rotate(objectMatrix.xVector(), fieldOfView[0]); 
    downVector = zVector.Rotate(objectMatrix.xVector(), -fieldOfView[0]); 
    leftVector = zVector.Rotate(objectMatrix.yVector(), fieldOfView[1]); 
    rightVector = zVector.Rotate(objectMatrix.yVector(), -fieldOfView[1]); 

    double angle = Math.PI/2 - Math.acos(new Common_Math.Matrix1X4(0, 1, 0, 0).Inner(objectMatrix.zVector().Invert())); 
    upVector = upVector.Scaled((int)(Math.abs(objectMatrix.qVector().getY() * Math.tan(angle + fieldOfView[0])))); 
    downVector = downVector.Scaled((int)(Math.abs(objectMatrix.qVector().getY() * Math.tan(angle - fieldOfView[0])))); 
    leftVector = leftVector.Scaled((int)(sight * Math.asin(fieldOfView[1]))); 
    rightVector = rightVector.Scaled((int)(sight * Math.asin(fieldOfView[1]))); 

    area.left = (int) objectMatrix.qVector().Add(leftVector).getX(); 
    area.top = (int) objectMatrix.qVector().Add(upVector).getY(); 
    area.right = (int) objectMatrix.qVector().Add(rightVector).getX(); 
    area.bottom = (int) objectMatrix.qVector().Add(downVector).getY(); 
} 

と、これはゲームオブジェクトのクラスである

public class GameObject { 

protected GameObject upperGameObject;//if upperGameObject is null, this GameObject is parent GameObject. 

protected Common_Math.Matrix4X4 objectMatrix; 
private Vector<SeaWeedComponent> componentVector; 

public GameObject() 
{ 
    objectMatrix = new Common_Math.Matrix4X4(); 
    AllocatePhysicsSpace(); 
    componentVector = new Vector<>(); 
} 

とMatrix4x4クラス

public static class Matrix4X4 
{ 
    private Matrix1X4 xVector, yVector, zVector, qVector; 

    public Matrix4X4() { 
     xVector = new Matrix1X4(1, 0, 0, 0); 
     yVector = new Matrix1X4(0, 1, 0, 0); 
     zVector = new Matrix1X4(0, 0, 1, 0); 
     qVector = new Matrix1X4(0, 0, 0, 1); 
    } 

ので、私はこれがなぜ起こったか確認するために、ブレークポイントをチェックしましたが、私はこれをデバッグするとき、すべての変数があります「データを収集しています..」と表示され、何も起こりません。デバッガの応答も遅くなります。

私はこれがなぜ起こるのか推測できません。私のコードに問題はありますか?どのように変数を見ることができますか?

答えて

0

GameObject.classの機能は何ですか? CameraクラスはGameObject.classを拡張しており、コンストラクタ内でsuper()を呼び出します。 varsが設定される前に、代わりにデバッガをスキップし、古典的なロギングを使用してください。

  • [更新]

シングルトンは、単一のインスタンスとしての地位を維持除き、特別何もしませんが、Androidのメーカーデバッガがそれらをどのように扱うか見当もつかないが、それは問題ではありません。 Camera.classをインスタンス化しようとするとNULLが返されます。

(カメラをインスタンス化する際にNullPointerをキャッチしてみ)

try { 
    Camera cam = new Camera(); 
} catch (NullPointerException e) { 
    e.printStackTrace(); 
} 

にNullPointerはコード

+0

私はゲームオブジェクトクラスを更新しました。私はあなたのアドバイスを試みます。 シングルトンパターンのコードを書くときにデバッガでエラーが発生するかどうか質問がありますか? –

0

ない、これはコメントまたは回答する必要がありますかどうかわからにある場合スタックトレースはあなたを教えてください。..

私はまったく違った状況で同じ問題を抱えていますが、どういうわけかスレッドを使うことと関係しています。 デバッガが値を取得しようとしたときに、別のスレッドに関連付けられた何かを実行する必要があると思われます。デッドロックです。

私の場合、私はJSを実行する必要があるときに非UIスレッドで呼び出されるjavascriptエンジンを持っています。変数がどこにあっても、たとえばJSObjectのサブクラスでは、デバッガがロックアップします。

これを回避するには、ログを記録してブレークポイントを賢明に設定するしかありません。

変数にアクセスする際にコードが実行されているかどうかを確認してください。原因が考えられます。

関連する問題