Android 主线程和线程之间相互发送消息

   通过分析Activity源码,我们知道每个Activity都有一个Looper,所以主线程在接收Message是不需要调用Looper.prepare()和Looper.loop(),但是线程是不带Looper的,当线程要接收来自主线程的消息是就需要调用Looper.prepare()和Looper.loop()。以下我们将通过一个示例,讲述主线程和线程之间如何发送Message。

 

01import android.app.Activity;
02import android.os.Bundle;
03import android.os.Handler;
04import android.os.Message;
05import android.widget.Toast;
06 
07/**
08 * 这个类是主线程,它每隔两秒就发送一个Message给线程,线程收到Message后将发送一个Message给主线程,主线程收到Message后会将Message内容Toast出来。
09 * org.fneg.HandlerTestActivity.java
10 * Create at: 2012-6-4 下午9:39:19
11 * @author:feng
12 * Email:fengcunhan@gmail.com
13 *
14 */
15public class HandlerTestActivity extends Activity {
16    private Handler uiHandler;
17    private ThreadWithLooper thread;
18    private Runnable showRunable;
19    @Override
20    public void onCreate(Bundle savedInstanceState) {
21        super.onCreate(savedInstanceState);
22        setContentView(R.layout.main);
23        uiHandler=new Handler(){
24            @Override
25            public void handleMessage(Message msg) {
26                switch(msg.what){
27                case Messages.MSG_HELLO:
28                     Toast.makeText(HandlerTestActivity.this, (String)msg.obj, Toast.LENGTH_SHORT).show();
29                    break;
30                     
31                }
32            }
33        };
34        thread=new ThreadWithLooper(uiHandler);
35         
36        thread.start();
37        showRunable=new Runnable() {
38             
39            @Override
40            public void run() {
41                //給线程发送一个Message
42                thread.getHandler().sendEmptyMessage(Messages.MSG_HELLO);
43                uiHandler.postDelayed(this, 2*1000);
44            }
45        };
46        uiHandler.post(showRunable);
47         
48    }
49     
50    @Override
51    protected void onStop() {
52        super.onStop();
53        uiHandler.removeCallbacks(showRunable);
54    }
55}

01import android.os.Handler;
02import android.os.Looper;
03import android.os.Message;
04 
05/**
06 * 从线程发送消息到UI线程(主线程)
07 * org.fneg.ThreadWithLooper.java
08 * Create at: 2012-6-4 下午4:58:11
09 * @author:feng<br/>
10 * Email:fengcunhan@gmail.com
11 *
12 */
13public class ThreadWithLooper extends Thread {
14    private Handler handler;
15     
16    private Handler uiHandler;
17     
18    public ThreadWithLooper(Handler mHandler){
19        this.uiHandler=mHandler;
20        //初始化Handler,接收到主线程发送过来的Message就回复一个Message给主线程,消息内容是 一个字符串和当前时间
21        handler =new Handler(){
22 
23            @Override
24            public void handleMessage(Message msg) {
25                switch(msg.what){
26                case Messages.MSG_HELLO:
27                     Message message=new Message();
28                     message.what=Messages.MSG_HELLO;
29                     message.obj="Yes!I get a hello"+System.currentTimeMillis();
30                     uiHandler.sendMessage(message);
31                    break;
32                     
33                }
34            }
35             
36        };
37    }
38     
39    public Handler getHandler() {
40        return handler;
41    }
42 
43    public void setHandler(Handler handler) {
44        this.handler = handler;
45    }
46     
47    @Override
48    public void run() {
49        Looper.prepare();
50         
51        Looper.loop();
52    }
53     
54     
55}

01/**
02 *
03 * org.fneg.Messages.java
04 * Create at: 2012-6-4 下午4:51:20
05 * @author:feng
06 * Email:fengcunhan@gmail.com
07 *
08 */
09public class Messages {
10   public static final int MSG_HELLO=0X1;
11}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现 Android Socket 循环互相发送消息,你可以使用以下步骤: 1. 在客户端和服务器端分别创建 Socket 对象,并建立连接。 2. 在客户端和服务器端分别创建输入流和输出流,用于读取和发送消息。 3. 在客户端和服务器端分别启动一个线程,用于循环读取对方发送消息,并将自己的消息发送给对方。 4. 在客户端线程中,使用输出流将消息发送给服务器端。 5. 在服务器端线程中,使用输出流将消息发送给客户端。 下面是一个简单的示例代码,演示了如何在 Android 上实现 Socket 循环互相发送消息: 客户端代码: ``` public class ClientThread implements Runnable { private Socket socket; private PrintWriter out; private BufferedReader in; public ClientThread(Socket socket) throws IOException { this.socket = socket; out = new PrintWriter(socket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); } @Override public void run() { try { while (true) { // 读取服务器端发送消息 String message = in.readLine(); if (message != null) { System.out.println("接收到服务器端消息:" + message); } // 发送消息给服务器端 out.println("Hello, server!"); } } catch (IOException e) { e.printStackTrace(); } finally { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } ``` 服务器端代码: ``` public class ServerThread implements Runnable { private Socket socket; private PrintWriter out; private BufferedReader in; public ServerThread(Socket socket) throws IOException { this.socket = socket; out = new PrintWriter(socket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); } @Override public void run() { try { while (true) { // 读取客户端发送消息 String message = in.readLine(); if (message != null) { System.out.println("接收到客户端消息:" + message); } // 发送消息给客户端 out.println("Hello, client!"); } } catch (IOException e) { e.printStackTrace(); } finally { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } ``` 在线程中启动客户端和服务器端线程: ``` public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; private static final int PORT = 12345; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new Thread(new Runnable() { @Override public void run() { try { // 创建客户端套接字并连接到服务器 Socket clientSocket = new Socket("localhost", PORT); Log.d(TAG, "已连接到服务器"); // 启动客户端线程 new Thread(new ClientThread(clientSocket)).start(); } catch (IOException e) { e.printStackTrace(); } } }).start(); new Thread(new Runnable() { @Override public void run() { try { // 创建服务器端套接字 ServerSocket serverSocket = new ServerSocket(PORT); Log.d(TAG, "服务器已启动"); while (true) { // 等待客户端连接 Socket clientSocket = serverSocket.accept(); Log.d(TAG, "已连接到客户端"); // 启动服务器端线程 new Thread(new ServerThread(clientSocket)).start(); } } catch (IOException e) { e.printStackTrace(); } } }).start(); } } ``` 这样,客户端和服务器端就可以循环互相发送消息了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值