1

我想做一个多线程程序,下面是我的试用。但只有 thread2 有效。如果我注释掉 thread2 部分,那么 thread1 可以工作。如何让它们同时工作?谢谢!

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.widget.EditText;

public class MainActivity extends Activity {
    private EditText edittext1, edittext2;
    volatile boolean bThreadRun = false;

    MyThread1 myThread1;
    MyThread2 myThread2;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        edittext1 = (EditText) findViewById(R.id.EditText1);
        edittext2 = (EditText) findViewById(R.id.EditText2);

        edittext1.setText("this is thread1");
        edittext2.setText("this is thread2");
    }

    @Override
    protected void onStart() {
        super.onStart();
        myThread1 = new MyThread1();
        myThread1.start();
        myThread2 = new MyThread2();
        myThread2.start();
        bThreadRun = true;
    }

    @Override
    protected void onPause() {
        super.onPause();
        bThreadRun = false;
        // myThread.stop();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    private Handler mHandler1 = new Handler() {
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case 1:
                updateEditText1();
                break;
            }
        };
    };

    private Handler mHandler2 = new Handler() {
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case 2:
                updateEditText2();
                break;
            }
        };
    };

    public void updateEditText1() {
        edittext1.append("thread1\n");
    }

    public void updateEditText2() {
        edittext2.append("thread2\n");
    }

    public class MyThread1 extends Thread {
        public MyThread1() {
        }

        @Override
        public void start() {
            super.start();
        }

        @Override
        public void run() {
            while (bThreadRun) {
                try {
                    sleep(500);
                    Message message = new Message();
                    message.what = 1;
                    mHandler1.sendMessage(message);
                } catch (InterruptedException ex) {
                }
            }
        }
    }

    public class MyThread2 extends Thread {
        public MyThread2() {
        }

        @Override
        public void start() {
            super.start();
        }

        @Override
        public void run() {
            while (bThreadRun) {
                try {
                    sleep(500);
                    Message message = new Message();
                    message.what = 2;
                    mHandler2.sendMessage(message);
                } catch (InterruptedException ex) {
                }
            }
        }
    }
}
4

2 回答 2

2

这是因为 Handler 实例是每个活动的。因此,您需要将两个线程传递给相同的 Handler 实例,然后它应该可以工作。

于 2012-12-28T15:57:34.783 回答
1

在调用 thread.start()之前,您应该有 'bThreadRun = true

于 2012-12-28T16:00:34.613 回答