0

次の単純なコードに問題があります。SurfaceView を拡張する GraphicView クラスを作成します。onCreate メソッドで始まる別のスレッドで実行します。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate( savedInstanceState );
    GraphicView v = new GraphicView( this );
    Thread thread = new Thread( v );
    thread.start();
    setContentView( v );    
}

理由はわかりませんが、アプリケーションを閉じるとエラーが発生します。タブレットで英語の UI を使用していませんが、英語では「アプリケーションでエラーが発生しました」のように聞こえると思います。そして、それ以上のものはありません!多分私はスレッドを停止する必要がありますか?コードにエラーはありますか?

public class GraphicView extends SurfaceView implements Runnable {

    Activity activity;
    SurfaceHolder holder;
    Paint paint;

    public GraphicView( Activity activity ) {

        super( activity );      

        this.activity = activity;

        paint = new Paint(); 
        paint.setColor( Color.YELLOW ); 
        paint.setStyle( Style.FILL ); 

        holder = getHolder();

    }

    @Override
    public boolean onTouchEvent( MotionEvent me ) {
        return false;
    }

    public void run() {

        while ( true ) {

            if ( !holder.getSurface().isValid() ) {
                continue;
            }

            Canvas c = holder.lockCanvas();
            c.drawARGB( 255, 128, 255, 80 );
            holder.unlockCanvasAndPost( c );

        }

    }

}

したがって、エラーは次のとおりです。

10-31 00:02:20.124: W/KeyCharacterMap(278): No keyboard for id 0
10-31 00:02:20.124: W/KeyCharacterMap(278): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
10-31 00:02:21.104: W/dalvikvm(278): threadid=11: thread exiting with uncaught exception (group=0x4001d800)
10-31 00:02:21.124: E/AndroidRuntime(278): FATAL EXCEPTION: Thread-10
10-31 00:02:21.124: E/AndroidRuntime(278): java.lang.NullPointerException
10-31 00:02:21.124: E/AndroidRuntime(278):  at com.example.GraphicView.run(GraphicView.java:192)
10-31 00:02:21.124: E/AndroidRuntime(278):  at java.lang.Thread.run(Thread.java:1096)

GraphicView.java の 192 行目:

c.drawARGB( 255, 128, 255, 80 );
4

1 に答える 1

1

while(true) を while(!yourActivity.isFinishing()) に置き換えてみてください

おそらく、Activity の onPause でループを中断し、onResume() で再開する方がよいでしょう。

于 2012-10-30T20:05:08.863 に答える