-1

混乱して申し訳ありませんが、Worng Logcat 情報を投稿しました。質問を更新しました。[開始] をクリックしてスレッドを開始し、Enter をクリックすると、スレッドを続行してメッセージを取得し、スレッドでメッセージを処理してから、それをメイン スレッドに出力し、テキスト ビューを更新します。Enter キーが押されるのを待ってハンドラのバンドルを取得するスレッドを開始するにはどうすればよいですか? ここに私のコードがあります:

public class MainActivity extends Activity implements OnClickListener {
Handler mHandler;
Button enter;
Button start;
TextView display;
String dateString;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    enter = (Button) findViewById(R.id.enter);
    start = (Button) findViewById(R.id.start);
    display = (TextView) findViewById(R.id.Display);
    enter.setOnClickListener(this);
    start.setOnClickListener(this);

    mHandler = new Handler() {  <=============================This is Line 31
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            super.handleMessage(msg);
            Bundle bundle = msg.getData();
            String string = bundle.getString("outKey");
            display.setText(string);

        }
    };
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    switch (v.getId()) {
    case R.id.enter:
        Message msgin = Message.obtain();
        Bundle bundlein = new Bundle();
        String in = "It Works!";
        bundlein.putString("inKey", in);
        msgin.setData(bundlein);
        notifyAll();

        break;
    case R.id.start:
        new myThread().hello.start();
        break;
    }
}

public class myThread extends Thread {
    Thread hello = new Thread() {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            super.run();
            Looper.prepare();
            try {
                wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            Handler Mhandler = new Handler() {

                @Override
                public void handleMessage(Message msg) {
                    // TODO Auto-generated method stub
                    super.handleMessage(msg);
                    Bundle bundle = msg.getData();
                    dateString = bundle.getString("inKey");
                }

            };
            Looper.loop();

            Message msg = Message.obtain();
            Bundle bundle = new Bundle();

            bundle.putString("outKey", dateString);
            msg.setData(bundle);
            mHandler.sendMessage(msg);

        }

    };

}
}

logcat 情報は次のとおりです。

06-27 00:00:24.832: E/AndroidRuntime(18513): FATAL EXCEPTION: Thread-1210
06-27 00:00:24.832: E/AndroidRuntime(18513): java.lang.IllegalMonitorStateException: object not locked by thread before wait()
06-27 00:00:24.832: E/AndroidRuntime(18513):    at java.lang.Object.wait(Native Method)
06-27 00:00:24.832: E/AndroidRuntime(18513):    at java.lang.Object.wait(Object.java:364)
06-27 00:00:24.832: E/AndroidRuntime(18513):    at com
.example.learninghandlers.MainActivity$myThread$1.run(MainActivity.java:77)
4

2 に答える 2

0

この投稿の時点でのあなたの現在のエラー、

java.lang.IllegalMonitorStateException: object not locked by thread before wait()

これは、wait() を試みた時点で、呼び出し元のスレッドがそのモニターを所有していないために発生します。

モニターを所有するには、このクラスのオブジェクトで同期されたコード ブロック内、またはクラスの同期されたメソッド内にいる必要があります。

ただし、スレッドの全体的な使用はかなり不規則に見え、この背後に別の問題が隠れている可能性があります。

于 2013-06-27T04:25:16.620 に答える
0

スタック トレースを見ると、答えが得られます。onCreate メソッド内のオブジェクトのうちの 1 つが null です。

06-26 21:48:55.387: E/AndroidRuntime(15578): Caused by: java.lang.NullPointerException
06-26 21:48:55.387: E/AndroidRuntime(15578):    at com.example.learninghandlers.MainActivity.onCreate(MainActivity.java:31)

問題は次の行の間にあります。

setContentView(R.layout.activity_main);
enter.setOnClickListener(this);

スタックがそれを教えてくれるので、これらの 1 つが null と評価されます。

enter = (Button) findViewById(R.id.enter);
start = (Button) findViewById(R.id.start);
display = (TextView) findViewById(R.id.Display);

したがって、問題は間違いなくこれにあり、null があります。

R.id.enter
R.id.start

どのオブジェクトがnullかを確認するために、デバッグできませんか?

于 2013-06-27T02:21:05.373 に答える