2013-01-07 3 views
1

그래서 나는이 코드를했습니다NullPointerException이

나는 그것이 NullPointer 왜 이해하지 Text = (TextView) findViewById(R.id.textView1); 그리고 난 라인을 언급하는 경우가 오류 없지만, 텍스트 뷰 그래서 텍스트가 null 변경하지 않은 :
01-07 22:13:01.375: D/Essai(31552): Test 1 
01-07 22:13:01.406: W/dalvikvm(31552): threadid=9: thread exiting with uncaught exception (group=0x4001f888) 
01-07 22:13:01.406: E/AndroidRuntime(31552): FATAL EXCEPTION: Thread-9 
01-07 22:13:01.406: E/AndroidRuntime(31552): java.lang.NullPointerException 
01-07 22:13:01.406: E/AndroidRuntime(31552): at android.app.Activity.findViewById(Activity.java:1637) 
01-07 22:13:01.406: E/AndroidRuntime(31552): at com.mat.archery.statistics.TargetActivity.receiveMyMessage(TargetActivity.java:36) 
01-07 22:13:01.406: E/AndroidRuntime(31552): at com.mat.archery.statistics.MySurfaceView.onDraw(MySurfaceView.java:133) 
01-07 22:13:01.406: E/AndroidRuntime(31552): at com.mat.archery.statistics.MySurfaceThread.run(MySurfaceThread.java:43) 

라인 (36)이다.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Test" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

<FrameLayout 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 
<com.mat.archery.statistics.MySurfaceView 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"/> 
</FrameLayout> 
</LinearLayout> 

내가 다른 스레드를 호출하는 곳은 다음과 같습니다 :

public class MySurfaceThread extends Thread { 
private SurfaceHolder myThreadSurfaceHolder; 
private MySurfaceView myThreadSurfaceView; 
private boolean myThreadRun = false; 

public double distance; 
public String result; 
public boolean touch = false; 


public MySurfaceView mSurfaceView = null; 

public MySurfaceThread(SurfaceHolder surfaceHolder, MySurfaceView surfaceView) { 
    myThreadSurfaceHolder = surfaceHolder; 
    myThreadSurfaceView = surfaceView; 
} 

public void setRunning(boolean b) { 
    myThreadRun = b; 
} 



@Override 
public void run() { 


    // TODO Auto-generated method stub 
    while(myThreadRun){ 
    Canvas c = null; 

    try{ 

    c = myThreadSurfaceHolder.lockCanvas(null); 
    synchronized (myThreadSurfaceHolder){ 
    myThreadSurfaceView.onDraw(c); 

    } 

    } 
    finally{ 
    // do this in a finally so that if an exception is thrown 
    // during the above, we don't leave the Surface in an 
    // inconsistent state 
    if (c != null) { 
    myThreadSurfaceHolder.unlockCanvasAndPost(c); 
    } 
    } 
    } 
} 
} 

을 그리고 그리기는 receiveMyMessage이이 곳은

가 도움이 될 수 있다면,이 레이아웃입니다 전화 :

public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback{ 

private MySurfaceThread thread; 
private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
private Paint paintJaune = new Paint(Paint.ANTI_ALIAS_FLAG); 
int cx, cy, offx, offy; 
private float initX, initY, radius; 
public double distx, disty, distance = 100; 
private boolean drawing = true; 
private boolean first = true; 
public boolean touch = false; 

public TextView Text; 

protected MySurfaceThread msurfacethread; 

public TargetActivity mActivity = null; 


public MySurfaceView(Context context) { 
    super(context); 
    // TODO Auto-generated constructor stub 
    init(); 
} 

public MySurfaceView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    // TODO Auto-generated constructor stub 
    init(); 
} 

public MySurfaceView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    // TODO Auto-generated constructor stub 
    init(); 
} 

private void init(){ 
     Log.d("Essai", "TargetActivity 5"); 


     getHolder().addCallback(this); 
     thread = new MySurfaceThread(getHolder(), this); 

     setFocusable(true); // make sure we get key events 

     paint.setColor(getResources().getColor(R.color.Fleche1Default)); 
     paint.setStyle(Style.FILL); 

     paintJaune.setColor(getResources().getColor(R.color.Jaune)); 
     paintJaune.setStyle(Style.FILL); 

     mActivity = new TargetActivity(); 

     Text = (TextView) findViewById(R.id.textView1); 

    } 

@Override 
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { 
    // TODO Auto-generated method stub 
    drawing = true; 
} 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 
    thread.setRunning(true); 
    thread.start(); 

} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 
    boolean retry = true; 
    thread.setRunning(false); 
    while (retry) { 
    try { 
    thread.join(); 
    retry = false; 
    } 
    catch (InterruptedException e) { 
    } 
    } 
} 

@Override 
    protected void onDraw(Canvas canvas) { 
     // TODO Auto-generated method stub 
     //super.onDraw(canvas); 
    int width = this.getWidth(); 
    int height = this.getHeight(); 



     if(drawing){ 
      canvas.drawColor(Color.BLACK); 
      canvas.drawCircle(width/2, height/2, 80, paintJaune); 
      canvas.drawCircle(initX, initY, radius, paint); 

      if (touch == true){ 
       distx = (width/2)-initX; 
       distx *= distx; 

       disty = (height/2)-initY; 
       disty *= disty; 

       distance = distx + disty; 
       distance = Math.sqrt(distance); 
      } 



      if((distance + radius/2) < 40) 
      { 
       mActivity.receiveMyMessage(); 
      } 

     } 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     // TODO Auto-generated method stub 
     //return super.onTouchEvent(event); 

     int action = event.getAction(); 
     if (action==MotionEvent.ACTION_MOVE){ 
      initX = event.getX(); 
      initY = event.getY(); 
      radius = 30; 
      drawing = true; 
      first = false; 
      touch = true; 
     } 
     else if (action==MotionEvent.ACTION_DOWN){ 
      initX = event.getX(); 
      initY = event.getY(); 
      radius = 30; 
      drawing = true; 
      first = false; 
      touch = true; 
     } 
     else if (action==MotionEvent.ACTION_UP){ 
      try { 
       Thread.sleep(50); 
      } catch (InterruptedException e) {} 
      drawing = false; 
      first = false; 
      touch = false; 
     } 

     return true; 

    } 

} 
+0

왜 onCreate에서 TextView를 찾은 후에 다시 TextView를 찾으려고합니까? – dymmeh

+0

'Activity'의 명시 적 생성자를 호출한다는 사실과 관련이있을 수 있습니다. 어쨌든'findViewById()'*는 NPE를 던져서는 안되지만 null을 리턴 할 수있다. 스택 추적은 다른 말을한다? –

+0

'receiveMyMessage()'가 언제 호출됩니까? 'findViewById'의 유일한 'null'은'getWindow()'가 null 인 경우입니다. 나는 A - C가 옳다고 생각하고 있습니다. 'Activity'의 생성자를 명시 적으로 호출하는 것은 거의 확실하게이 문제를 일으키는 원인입니다. – Eric

답변

0

당신을 일인가있는 것이다

mActivity = new TargetActivity();

당신은 그렇게 할 수 없습니다. 시스템 만 활동을 인스턴스화 할 수 있습니다.

너는 떠날 수 있습니다. mActivity = (TargetActivity) getContext();

나는 그것을 권하고 싶지 않지만 당신의 즉각적인 문제를 해결할 것입니다.

브로드 캐스트 인 텐트를 사용하여 메시지를 보내야합니다. 당신이 당신의 자신의 방송 수신기를 구현해야하는 경우

getContext().sendBroadcast(new Intent("DRAWING_FINISHED"));

.