代码如下://ConnTestActivity.javapackage conn.test;import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;public class ConnTestActivity extends Activity {
private Handler myHandler = new Handler()
    {
     public void handleMessage(Message msg)
     {
         System.out.println(msg.obj.toString());
         super.handleMessage(msg);
     }
    };
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        System.out.println("01");
        Handler our = null;
        myThread myTr;
try {
myTr = new myThread();//.start();
myTr.start();
our = new Handler(myTr.getMyLooper());
if(myTr.getMyLooper() == null) System.out.println("nimei");
Message subMsg = new Message();//our.obtainMessage(1, "Message From Main!!");
subMsg.arg1 = 1;
subMsg.obj = "MessageFormMain";
our.sendMessage(subMsg);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
        setContentView(R.layout.main);
    }
}
//myThread.java
package conn.test;import android.os.Handler;
import android.os.Looper;
import android.os.Message;public class myThread extends Thread{
private Looper myLooper;
private MyHandler myHandler;
private String arg;//用于初始化Thread
private static final Object mLock = new Object();
//
//在主线程中调用
public myThread() throws InterruptedException
{
myLooper = null;
myHandler = null;
}

//子线程中初始化
public void run()
{
        Looper.prepare();
 synchronized (mLock)
 {
             myLooper = Looper.myLooper();
             myHandler = new MyHandler(myLooper);
             mLock.notifyAll();
         }
 Handler mainHandler = new Handler(Looper.getMainLooper());
 Message toMain = new Message();//mainHandler.obtainMessage(1, "Message From Sub!!");
 toMain.obj = "fuck";
 mainHandler.sendMessage(toMain);
 System.out.println("03" + Thread.currentThread().getName());
 Looper.loop();
}

public Handler getMyHandler()
{
synchronized(mLock)
{
while(myLooper == null || myHandler == null)
{
try
{
mLock.wait();
}catch(InterruptedException e){}
}
}
return myHandler;
}

public Looper getMyLooper()
{
synchronized(mLock)
{
while(myLooper == null || myHandler == null)
{
try
{
mLock.wait();
}catch(InterruptedException e){}
}
}
return myLooper;
}
}
class MyHandler extends Handler
{
public MyHandler(Looper looper)
{
super(looper);
}

public void handleMessage(Message msg)
{
System.out.println(msg.obj.toString());
Looper mainLooper = Looper.getMainLooper();
Handler mainHandler = new Handler(mainLooper);
Message toMain = mainHandler.obtainMessage(1, "Message From Sub!!");
mainHandler.sendMessage(toMain);
super.handleMessage(msg);
}
}
为什么我收不到主线程发给子线程的消息以及子线程发给主线程的消息??我是Android菜鸟,求指点啊!!

解决方案 »

  1.   

    我知道怎么回事了,修改后的代码:package conn.test;import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Looper;
    import android.os.Message;
    import android.util.Log;public class ConnTestActivity extends Activity {

    ////////////////////////////////////////////////////////

    ////////////////////////////////////////////////////////


    Handler myHandler = new Handler()
        {
         public void handleMessage(Message msg)
         {
             System.out.println(msg.obj.toString() + Thread.currentThread().getName());
             super.handleMessage(msg);
         }
        };
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            System.out.println("01");
            Handler our = null;
            myThread myTr;
    try {
    myTr = new myThread(this);//.start();
    myTr.start();
    our = myTr.getMyHandler();//our = new Handler(myTr.getMyLooper());
    if(myTr.getMyLooper() == null) System.out.println("nimei");
    Message subMsg = new Message();//our.obtainMessage(1, "Message From Main!!");
    // Message ourMessage = myHandler.obtainMessage(1, "hehhee");
    // ourMessage.sendToTarget();
    subMsg.arg1 = 1;
    subMsg.obj = "MessageFormMain";
    if(our.sendMessage(subMsg))System.out.println("wokao ");
    } catch (InterruptedException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    }
            setContentView(R.layout.main);
        }
    }package conn.test;import android.os.Handler;
    import android.os.Looper;
    import android.os.Message;public class myThread extends Thread{
    private Looper myLooper;
    private MyHandler myHandler;
    private String arg;//用于初始化Thread
    private ConnTestActivity connTestActivity;
    private static final Object mLock = new Object();
    //
    //在主线程中调用
    public myThread(ConnTestActivity connTestActivity) throws InterruptedException
    {
    myLooper = null;
    myHandler = null;
    this.connTestActivity = connTestActivity;
    }

    //子线程中初始化
    public void run()
    {
            Looper.prepare();
     synchronized (mLock)
     {
                 myLooper = Looper.myLooper();
                 myHandler = new MyHandler(myLooper);
                 mLock.notifyAll();
             }
     
     Handler mainHandler = connTestActivity.myHandler;//new Handler(Looper.getMainLooper());
     Message toMain = new Message();//mainHandler.obtainMessage(1, "Message From Sub!!");
     toMain.obj = "From Sub";
     mainHandler.sendMessage(toMain);
     Looper.loop();
    }

    public Handler getMyHandler()
    {
    synchronized(mLock)
    {
    while(myHandler == null)
    {
    try
    {
    mLock.wait();
    }catch(InterruptedException e){}
    }
    }
    return myHandler;
    }

    public Looper getMyLooper()
    {
    synchronized(mLock)
    {
    while(myLooper == null)
    {
    try
    {
    mLock.wait();
    }catch(InterruptedException e){}
    }
    }
    return myLooper;
    }
    }
    class MyHandler extends Handler
    {
    public MyHandler(Looper looper)
    {
    super(looper);
    }

    public void handleMessage(Message msg)
    {
    System.out.println(msg.obj.toString() + Thread.currentThread().getName());
    Looper mainLooper = Looper.getMainLooper();
    Handler mainHandler = new Handler(mainLooper);
    Message toMain = mainHandler.obtainMessage(1, "Message From Sub!!");
    toMain.sendToTarget();
    super.handleMessage(msg);
    }
    }
      

  2.   

    通过这个问题可以知道如果我们想要对相应线程的Looper进行控制则必须获得其对应的Handler对象,而这个对象是在不同的类里面的,那么如何获取成了主要的问题,我们可以在子线程中通过传入this来获取主线程的Handler,而对于子线程则可以通过自己实现的方法getHandler方法来实现。这样就能自由地进行消息传递了。对于子线程的构造函数中的this参数,这种思想是很好的。不仅可以在此个问题中借鉴。