1

私は小さなAndroidゲームを書いています。ImageButtons として実装した 4 匹の動物のランダムなシーケンスを表示する必要があります。ユーザーはこのシーケンスを覚えて、後で繰り返す必要があります。

私の問題は、Imagebuttons が表示される適切なタイミングです。

次の NullPointerException が発生しましたが、その理由がわかりませんでした。誰か助けてくれるかも!?

私の主な活動は次のとおりです。

package lichtenberger.paul;

import java.util.Random;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageButton;
import android.widget.TextView;

public class Game extends Activity {

    int Reihenfolge[] = new int[40];

    Random generator = new Random();


    public final int CAT = 0;
    public final int MAN = 1;
    public final int BIRD = 2;
    public final int SHEEP = 3;
    public Handler handler;
    public Thread AnimalThread;
    {for(int i = 0; i<40; i++)Reihenfolge[i]=generator.nextInt(4);}


    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_game);

        final ImageButton cat = (ImageButton)findViewById(R.id.catButton);
        final ImageButton sheep = (ImageButton)findViewById(R.id.sheepButton);
        final ImageButton man = (ImageButton)findViewById(R.id.manButton);
        final ImageButton bird = (ImageButton)findViewById(R.id.birdButton);
        final TextView score = (TextView)findViewById(R.id.scoreNTV);

        handler = new Handler(){

            @Override

            public void handleMessage(Message msg){

                switch (msg.what) {
                case 0:
                    cat.setVisibility(1);
                    man.setVisibility(0);
                    bird.setVisibility(0);
                    sheep.setVisibility(0);
                    break;
                case 1:
                    man.setVisibility(1);
                    bird.setVisibility(0);
                    sheep.setVisibility(0);
                    cat.setVisibility(0);
                    break;
                case 2:
                    bird.setVisibility(1);
                    sheep.setVisibility(0);
                    cat.setVisibility(0);
                    man.setVisibility(0);
                    break;
                case 3:
                    sheep.setVisibility(1);
                    cat.setVisibility(0);
                    man.setVisibility(0);
                    bird.setVisibility(0);
                    break;
                }

            }
        };          
            ShowSequence show = new ShowSequence();
            Thread showSeq = new Thread(show);
            showSeq.start();

        };

}

私のスレッドクラス:

package lichtenberger.paul;   

public class ShowSequence extends Game implements Runnable{    
    @Override
    public void run() {                 
        show();
    }

    private void show() {

        for(int i = 0; i<40; i++){
        switch (Reihenfolge[i]) {
        case 0:
                try {
                // this pauses the Thread: Alternative to doing stuff...
                Thread.sleep(2000);

                handler.sendEmptyMessage(CAT);
                } catch (InterruptedException e) {
                e.printStackTrace();}
                break;

        case 1:
            try {
                // this pauses the Thread: Alternative to doing stuff...
                Thread.sleep(2000);

                handler.sendEmptyMessage(MAN);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            break;

        case 2:
            try {
                // this pauses the Thread: Alternative to doing stuff...
                Thread.sleep(2000);

                handler.sendEmptyMessage(BIRD);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            break;

        case 3: 
            try {
                // this pauses the Thread: Alternative to doing stuff...
                Thread.sleep(2000);

                handler.sendEmptyMessage(SHEEP);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        default:
            break;
        }
    }
}}

そして私のLogCat:

12-20 15:20:34.974: ERROR/AndroidRuntime(598): FATAL EXCEPTION: Thread-75
12-20 15:20:34.974: ERROR/AndroidRuntime(598): java.lang.NullPointerException
12-20 15:20:34.974: ERROR/AndroidRuntime(598):     at lichtenberger.paul.ShowSequence.show(ShowSequence.java:50)
12-20 15:20:34.974: ERROR/AndroidRuntime(598):     at lichtenberger.paul.ShowSequence.run(ShowSequence.java:10)
12-20 15:20:34.974: ERROR/AndroidRuntime(598):     at java.lang.Thread.run(Thread.java:856)

編集:

機能しなかった1つのアクティビティのコード全体:

package lichtenberger.paul;

import java.util.Random;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageButton;
import android.widget.TextView;

public class Game extends Activity {

    int Reihenfolge[] = new int[40];

    Random generator = new Random();
    public ImageButton cat;
    public ImageButton man;
    public ImageButton bird;
    public ImageButton sheep;
    public TextView score;
    private static Handler handler;
    public final int CAT = 0;
    public final int MAN = 1;
    public final int BIRD = 2;
    public final int SHEEP = 3;
    public Runnable showAnimal;
    public Thread AnimalThread;
    {for(int i = 0; i<40; i++)Reihenfolge[i]=generator.nextInt(4);}


    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_game);

        setupUI();
        showSequence();
        initHandler();
    }



    public void showSequence() {

                showAnimal = new showAnimal();
                AnimalThread = new Thread(showAnimal);
                AnimalThread.start();


    }



    public void setupUI() {

        cat = (ImageButton)findViewById(R.id.catButton);
        sheep = (ImageButton)findViewById(R.id.sheepButton);
        man = (ImageButton)findViewById(R.id.manButton);
        bird = (ImageButton)findViewById(R.id.birdButton);
        score = (TextView)findViewById(R.id.scoreNTV);

    }

    private void initHandler() {
        handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                case CAT:
                    cat.setVisibility(1);
                    man.setVisibility(0);
                    bird.setVisibility(0);
                    sheep.setVisibility(0);
                    break;
                case MAN:
                    man.setVisibility(1);
                    bird.setVisibility(0);
                    sheep.setVisibility(0);
                    cat.setVisibility(0);
                    break;
                case BIRD:
                    bird.setVisibility(1);
                    sheep.setVisibility(0);
                    cat.setVisibility(0);
                    man.setVisibility(0);
                    break;
                case SHEEP:
                    sheep.setVisibility(1);
                    cat.setVisibility(0);
                    man.setVisibility(0);
                    bird.setVisibility(0);
                    break;
                }
            }
        };

    }

    class showAnimal implements Runnable {
        public void run() {
            show();
        }

        private void show() {

            for(int i = 0;i<40;i++){

            switch (Reihenfolge[i]) {

            case 0:
                try {
                    // this pauses the Thread: Alternative to doing stuff...
                    Thread.sleep(2000);

                    handler.sendEmptyMessage(CAT);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                break;

            case 1:
                try {
                    // this pauses the Thread: Alternative to doing stuff...
                    Thread.sleep(2000);

                    handler.sendEmptyMessage(MAN);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                break;

            case 2:
                try {
                    // this pauses the Thread: Alternative to doing stuff...
                    Thread.sleep(2000);

                    handler.sendEmptyMessage(SHEEP);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                break;
            case 3:
                try {
                    // this pauses the Thread: Alternative to doing stuff...
                    Thread.sleep(2000);

                    handler.sendEmptyMessage(BIRD);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                break;
            }
        }
    }



}
}

手伝ってくれてありがとう ;)

4

4 に答える 4

2

問題は、2つの別々のオブジェクトがあることです-そのインスタンスにはGamenull以外のハンドラーがあります。そしてShowSequence、nullハンドラーを使用したインスタンス。ShowSequecneから継承しないでくださいGame。すべてGameの変数を自動的に取得するわけではありません。@harismが提案するようShowSequenceに、inの内部クラスを作成する必要があります。または、コンストラクターで明示的に、または作成直後にGameすべての変数を設定する必要があります。ShowSequence

于 2012-12-20T14:42:38.160 に答える
0

ゲームからShowSequenceを内部化するのではなく、ハンドラーをパラメーターとして渡すことができます

//アクティビティ

ShowSequence show = new ShowSequence(handler);
            Thread showSeq = new Thread(show);
            showSeq.start();

//スレッドクラス

public class ShowSequence implements Runnable{
Handler handler = null;

public ShowSequence(handler){
      this.handler = handler;
}
于 2012-12-20T14:47:35.800 に答える
0

ポール、

「ハンドラ」変数をvolatileにしてみましたか? 同期 ( synchronizedキーワード)を使用せずに、ワーカー スレッド (「ShowSequence」ランナブルを実行しているスレッド) からこの変数にアクセスします。なんらかの形式の同期を追加することを検討したい場合もありますが (コードを調べてその判断を下すのに十分ではありませんでした)、少なくとも、あるスレッドからの「ハンドラー」への書き込みが他のスレッドから見えるようにする必要があります。volatile 修飾子は、それを実現する方法です。

幸運を!

PS: ShowSequence はゲームを拡張しますか? 次にアクティビティを拡張するのはどれですか? この継承ツリーも確認する必要があると思います..これが必要かどうかわかりません..

于 2012-12-20T14:39:58.487 に答える
0

実際の問題は、デバッグ中に発見した別のものでした。すべての写真が一度に表示されたのは、非常に短い間隔でスレッドを開始したためです。showSequence メソッドのループごとに delaytime を変更することでこれを解決しました。

だからここに私の完全なクラスがあります:

package lichtenberger.paul;

import java.util.Random;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;

public class Game extends Activity {

    int Reihenfolge[] = new int[40];

    Random generator = new Random();


    public final int CAT = 0;
    public final int MAN = 1;
    public final int BIRD = 2;
    public final int SHEEP = 3;
    public final int PAUSE = 4;
    public final int ALL = 5;
    public int Zug = 40;
    public int time = 0;
    public Handler handler;
    public Thread AnimalThread;
    public ImageButton cat;
    public ImageButton man;
    public ImageButton bird;
    public ImageButton sheep;

    {for(int i = 0; i<40; i++)Reihenfolge[i]=generator.nextInt(4);}


    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_game);

        cat = (ImageButton)findViewById(R.id.catButton);
        sheep = (ImageButton)findViewById(R.id.sheepButton);
        man = (ImageButton)findViewById(R.id.manButton);
        bird = (ImageButton)findViewById(R.id.birdButton);
        final TextView score = (TextView)findViewById(R.id.scoreNTV);

        handler = new Handler(){

            @Override

            public void handleMessage(Message msg){

                switch (msg.what) {
                case CAT:
                    cat.setVisibility(View.VISIBLE);
                    man.setVisibility(View.INVISIBLE);
                    bird.setVisibility(View.INVISIBLE);
                    sheep.setVisibility(View.INVISIBLE);

                    break;
                case MAN:
                    man.setVisibility(View.VISIBLE);
                    bird.setVisibility(View.INVISIBLE);
                    sheep.setVisibility(View.INVISIBLE);
                    cat.setVisibility(View.INVISIBLE);

                    break;
                case BIRD:
                    bird.setVisibility(View.VISIBLE);
                    sheep.setVisibility(View.INVISIBLE);
                    cat.setVisibility(View.INVISIBLE);
                    man.setVisibility(View.INVISIBLE);

                    break;
                case SHEEP:
                    sheep.setVisibility(View.VISIBLE);
                    cat.setVisibility(View.INVISIBLE);
                    man.setVisibility(View.INVISIBLE);
                    bird.setVisibility(View.INVISIBLE);

                    break;

                case PAUSE:
                    sheep.setVisibility(View.INVISIBLE);
                    cat.setVisibility(View.INVISIBLE);
                    man.setVisibility(View.INVISIBLE);
                    bird.setVisibility(View.INVISIBLE);

                case ALL:
                    sheep.setVisibility(View.VISIBLE);
                    cat.setVisibility(View.VISIBLE);
                    man.setVisibility(View.VISIBLE);
                    bird.setVisibility(View.VISIBLE);
                 }

            }
        };

        time = 0;
        Zug = 40;
        showGameSeq(time, Zug); 
        }



    public int showGameSeq(int time, int Zug) {
        ShowSequence show;
        Thread showSeq;
        int x = 0;

        for(int i = 1; i<=Zug; ++i, ++x){

                if(Reihenfolge[i-1]!=Reihenfolge[i-1]){

                    show = new ShowSequence(Reihenfolge[i-1], time);
                    showSeq = new Thread(show);
                    showSeq.start();
                    time = time + 1000;}

                else{
                    show = new ShowSequence(Reihenfolge[i-1], time);
                    showSeq = new Thread(show);
                    showSeq.start();
                    time = time + 1000;

                    show = new ShowSequence(PAUSE, time);
                    showSeq = new Thread(show);
                    showSeq.start();
                    time = time + 500;

                }
            }


        if(x==Zug){ 
        show = new ShowSequence(ALL, time);
        showSeq = new Thread(show);
        showSeq.start();
        }else{};


        return time;
    };



    private class ShowSequence implements Runnable{

        int which;
        int time;

        public ShowSequence(int which, int time) {
            this.which = which;
            this.time = time;
        }

        @Override
        public void run() {

            show();

        }

        private void show() {

                switch (which) {
                case CAT:

                    handler.sendEmptyMessageDelayed(CAT, time);
                    break;
                case MAN:

                    handler.sendEmptyMessageDelayed(MAN, time);
                    break;
                case BIRD:

                    handler.sendEmptyMessageDelayed(BIRD, time);
                    break;
                case SHEEP:

                    handler.sendEmptyMessageDelayed(SHEEP, time);
                    break;

                case PAUSE:

                    handler.sendEmptyMessageDelayed(PAUSE, time);
                    break;

                case ALL:

                    handler.sendEmptyMessageDelayed(ALL, time);
                    break;

                }
        }
        }
        }

私のソリューションに刺激を与えてくれたみんなに感謝します!!! :)

于 2012-12-20T18:22:12.020 に答える