android 线程间的通信

在Android,线程分为有消息循环的线程和没有消息循环的线程,有消息循环的线程一般都会有一个Looper。我们的主线程(UI线程)就是一个消息循环的线程。针对这种消息循环的机制,我们引入一个新的机制Handler,我们有消息循环,就要往消息循环里面发送相应的消息,自定义消息一般都会有自己对应的处理,消息的发送和清除,把这些都封装在Handler里面,注意Handler只是针对那 些有Looper的线程,不管是UI线程还是子线程,只要你有Looper,我就可以往你的消息队列里面添加东西,并做相应的处理。

一个Handler的创建它就会被绑定到这个线程的消息队列中,如果是在主线程创建的,那就不需要写代码来创建消息队列了,默认的消息队列会在主线程被创建。但是如果是在子线程的话,就必须在创建Handler之前先初始化线程的消息队列。

实例如下:

package com.example.android_handle;

import java.io.BufferedInputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

import org.apache.http.util.ByteArrayBuffer;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.text.method.ScrollingMovementMethod;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

    private Handler mHandler;
    private Button start;
    private TextView text;
    private int i = 0;
    private Handler handler;
    private NewThread thread = new NewThread();
    private String s = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        start = (Button) findViewById(R.id.start);
        text = (TextView) findViewById(R.id.text);
        text.setMovementMethod(ScrollingMovementMethod.getInstance());

        handler = new Handler() {

            @Override
            public void handleMessage(Message msg) {
                // TODO Auto-generated method stub
                s = s + msg.obj + "\n";
                text.setText(s);
                Message childMsg = mHandler.obtainMessage();
                childMsg.obj = mHandler.getLooper().getThread()
                        .getName()
                        + " says Hello";
                mHandler.sendMessage(childMsg);
            }

        };

        thread.start();

        start.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                if (mHandler != null) {
                    // 发送消息给子线程
                    Message childMsg = mHandler.obtainMessage();
                    childMsg.obj = mHandler.getLooper().getThread()
                            .getName()
                            + " says Hello";
                    mHandler.sendMessage(childMsg);

                }
            }

        });
    }

    private class NewThread extends Thread {
        private Looper mLooper;
        private String content;

        public void run() {
            Looper.prepare();
            mLooper = Looper.myLooper();
            mHandler = new Handler(mLooper) {

                @Override
                public void handleMessage(Message msg) {
                    // TODO Auto-generated method stub
                    try {
                        sleep(1000);
//                      URL uri = new URL("http://112.74.78.53/scut-lib/"
//                              + "library/hotReading.php");
//                      URLConnection ucon = uri.openConnection();
//                      ucon.setConnectTimeout(10000);
//                      InputStream is = ucon.getInputStream();
//                      BufferedInputStream bis = new BufferedInputStream(is);
//                      ByteArrayBuffer baf = new ByteArrayBuffer(100);
//                      int current = 0;
//                      while ((current = bis.read()) != -1) {
//                          baf.append((byte) current);
//                      }
//                      content = new String(baf.toByteArray(), "UTF-8");
                    } catch (Exception e) {
//                      content = e.toString();
                    }
                    i++;
                    Message msg1 = Message.obtain();
                    msg1.obj = i+"";
                    handler.sendMessage(msg1);
                }

            };

            Looper.loop();
        }

    }

}

更加详细,请看Android中线程通讯类Handlerhttp://uule.iteye.com/blog/1705951

时间: 2024-10-10 20:46:17

android 线程间的通信的相关文章

Android线程间通信机制

当android应用程序运行时,一个主线程被创建(也称作UI线程),此线程主要负责处理UI相关的事件,由于Android采用UI单线程模型,所以只能在主线程中对UI元素进行操作,如果在非UI线程直接对UI进行了操作,则会报错,另外,对于运算量较大的操作和IO操作,我们需要新开线程来处理这些工作,以免阻塞UI线程,子线程与主线程之间是怎样进行通信的呢?此时就要采用消息循环机制(Looper)与Handler进行处理. 一.基本概念 Looper:每一个线程都可以产生一个Looper,用来管理线程的

Android 线程间通信

进程与线程的区别? 在Android中,线程是跑在进程之中的,当手机打开一个APP就相当于打开了一个进程,比如:UI界面的更新,就是在主线程中完成的,我也可以自定义一些子线程来完成所需要的任务. 如何创建线程?创建线程的几种方式? 1.创建一个类继承Thread类 2.创建一个类实现Runnable接口 什么是多线程? 线程是程序中一个单一的顺序控制流程,在程序中同是运行多个线程完成不同的工作,称为多线程 ANR的基础知识及产生? ANR:application not responding :

android线程间通讯

近来找了一些关于android线程间通信的资料,整理学习了一下,并制作了一个简单的例子. andriod提供了 Handler 和 Looper 来满足线程间的通信.例如一个子线程从网络上下载了一副图片,当它下载完成后会发送消息给主线程,这个消息是通过绑定在主线程的Handler来传递的. 在Android,这里的线程分为有消息循环的线程和没有消息循环的线程,有消息循环的线程一般都会有一个Looper,这个事android的新 概念.我们的主线程(UI线程)就是一个消息循环的线程.针对这种消息循

新建线程与UI线程间的通信

现在用一个实例来演示一下自己的新建线程与UI线程间的通信. UI界面包含3个控件: 一个输入框,用来输入数字: 一个显示框,用来显示从2开始,到输入数字之间的所有质数: 一个按钮,点击后获取输入框输入的数字,交给新建线程处理,线程计算质数后把结果传给UI线程,UI线程显示结果到显示框. XML如下: 1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android=&q

从AIDL开始谈Android进程间Binder通信机制

本文首先概述了Android的进程间通信的Binder机制,然后结合一个AIDL的例子,对Binder机制进行了解析. 概述 我们知道,在Android app中的众多activity,service等组件可以运行在同一进程中,也可以运行在不同进程中.当组件运行在同一进程中进行通信就显得比较简单,在之前的Android线程间通信机制中已经讲过了:而当它们运行在不同的进程中时,就需要使用我们本文中所要介绍的Binder机制了. Binder作为一种进程间通信机制,负责提供远程调用的功能(RPC),

Android进程间的通信之AIDL

Android服务被设计用来执行很多操作,比如说,可以执行运行时间长的耗时操作,比较耗时的网络操作,甚至是在一个单独进程中的永不会结束的操作.实现这些操作之一是通过Android接口定义语言(AIDL)来完成的.AIDL被设计用来执行进程间通信,另一种实现方式见博文Android进程间的通信之Messenger.本文我们将学习如何创建AIDL文件实现Android进程间通信.在正式学习之前,我们先澄清一些"事实". 关于Android Service 1.Android服务不是后台任务

Handler不同线程间的通信

转http://www.iteye.com/problems/69457 Activity启动后点击一个界面按钮后会开启一个服务(暂定为padService),在padService中会启动一个线程(暂定为Thread-3)发起Socket连接.我们项目中使用mina作为socket通信框架,用过mina的同志们应该熟悉,Thread-3只是负责监听,具体的消息处理是另外的线程.在我们的IoHandler中处理消息,现在的问题是,我需要在IoHander的sessionOpened方法中给Act

线程间的通信、同步方式与进程间通信方式

1.线程间的通信方式 1)使用全局变量(由于多个线程可能更改全局变量,因此全局变量最好声明为volatile) 2) 使用消息实现通信 3)使用事件CEvent类实现线程间的通信 2.同步/异步(C端) 同步:在C端发出一个功能调用时,没有得到结果之前就不返回 异步: 一个请求通过事件触发后,得到服务器处理后才处理完毕 3. 阻塞/非阻塞(S端) 阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行).函数只有在得到

线程(二)__线程间的通信

线程间的通信:多个线程在处理同一资源,但是任务却不同.一.等待唤醒机制涉及的方法:1.wait();让线程处于冻结状态,被wait的线程会被存储到线程池中2.notify();唤醒线程池中的一个任意线程3.notifyAll();唤醒线程池中的所有线程这些方法都必须定义在同步中,因为这些方法是用于操作线程状态的方法,必须要明确到底操作的是哪个锁上的线程wait()对A锁上面的线程进行操作后只能用A锁的notify来唤醒.被wait之后的线程可认为放在线程池中. 为什么操作线程的方法wait no