精华内容
下载资源
问答
  • android 子线程使用handler通信

    千次阅读 2019-03-28 11:11:27
    我们日常使用处理线程间的通信是 主线与子线程之间相互通信,也就是使用android提供的handler。 那么子线程之间如何相互通信呢?一般有可能会使用 全局变量来进行通信,其实我们也可以使用系统提供的handler来...

      我们日常使用处理线程间的通信是 主线程与子线程之间相互通信,也就是使用android提供的handler。

      那么子线程之间如何相互通信呢?一般有可能会使用 全局变量来进行通信,其实我们也可以使用系统提供的handler来进行子线程中的通信。

     handler的通信机制

    此处引用:https://blog.csdn.net/blackzhangwei/article/details/51945516

    由上图可以看出  handler负责消息的处理和发送的,messageQueue 是存储消息队列的,Looper 是处理消息的

    主线程在创建时或创建 looper 所以我们子线程可以和主线程通信,那么由此我们也可以在子线程中创建looper 来实现子线程中的通信。

    线程1

    Runnable runnable1 = new Runnable() {
            @Override
            public void run() {
                Looper.prepare();
                handler = new Handler() {
                    @Override
                    public void handleMessage(Message msg) {
                        super.handleMessage(msg);
                        Log.e("Data", "handleMessage: " + msg.obj.toString());
                    }
                };
                Looper.loop();
            }
        };

    线程2

    Runnable runnable2 = new Runnable() {
            @Override
            public void run() {
                //Looper looper = Looper.myLooper();
                Message message = handler.obtainMessage();
                message.obj = "你好啊,线程一";
                handler.sendMessage(message);
            }
        };

    线程二中使用的 handler 是线程一中创建的 handler

    线程一中使用的looper方法

    Looper.prepare();   将当前线程初始化为 消息线程   

    Looper.loop();  在此线程中运行 消息队列

    那么如何停止运行呢

    Looper.quit();   停止运行消息队列,不处理任何消息。

    更多looper方法 

    https://developer.android.google.cn/reference/android/os/Looper.html

    英文是半吊子的,可以像我一样翻译网页。 ??

    展开全文
  • Android 子线程创建handler

    千次阅读 2017-12-24 22:55:05
    我们会很清楚地使用了子线程和Ui线程通信的问题。 即解决了一个网络请求成功或者失败后,通知ui线程更新界面的case。 但是有人会疑问,那子线程中是否可以创建一个Handler,仅仅通知线程呢? 答案是肯定的。 直接上...

    据上篇我转载的 Handler,Looper, Message 三者关系深入消化,理解后。我们会很清楚地使用了子线程和Ui线程通信的问题。

    即解决了一个网络请求成功或者失败后,通知ui线程更新界面的case。

    但是有人会疑问,那子线程中是否可以创建一个Handler,仅仅通知线程呢? 答案是肯定的。

    直接上代码。

    1. new Thread(new Runnable() {  
    2.             public void run() {  
    3.                 Handler handler = new Handler(){  
    4.                     @Override  
    5.                     public void handleMessage(Message msg) {  
    6.                         Toast.makeText(getApplicationContext(), "handler msg", Toast.LENGTH_LONG).show();  
    7.                     }  
    8.                 };  
    9.                 handler.sendEmptyMessage(1);  
    10.                   
    11.             };  
    12.         }).start();  
    很遗憾,会报错:

    01-12 02:49:31.814: E/AndroidRuntime(2226): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare(),需要looper.prepare().

    1. new Thread(new Runnable() {  
    2.             public void run() {  
    3.                 Looper.prepare();  // 此处获取到当前线程的Looper,并且prepare()  
    4.                 Handler handler = new Handler(){  
    5.                     @Override  
    6.                     public void handleMessage(Message msg) {  
    7.                         Toast.makeText(getApplicationContext(), "handler msg", Toast.LENGTH_LONG).show();  
    8.                     }  
    9.                 };  
    10.                 handler.sendEmptyMessage(1);  
    11.                   
    12.             };  
    13.         }).start();  
    运行后发现还是报错,因为上篇博文有提到

    1、Looper.prepare()是给这个Thread创建Looper对象,一个Thead只有一个Looper对象。

    2、Looper对象需要一个MessageQueue对象一个Looper实例也只有一个MessageQueue。

    3、调用Looper.loop();  不断遍历MessageQueue中是否有消息。

    4、Handler 作用是发消息到MessageQueue,从而回掉Handler 的HandleMessage的回掉方法。

    1. new Thread(new Runnable() {  
    2.             public void run() {  
    3.                 Looper.prepare();  
    4.                 Handler handler = new Handler(){  
    5.                     @Override  
    6.                     public void handleMessage(Message msg) {  
    7.                         Toast.makeText(getApplicationContext(), "handler msg", Toast.LENGTH_LONG).show();  
    8.                     }  
    9.                 };  
    10.                 handler.sendEmptyMessage(1);  
    11.                 Looper.loop();  
    12.             };  
    13.         }).start();  
    这样就Ok了。


    方法二:获取主线程的looper,或者说是UI线程的looper

    这个方法简单粗暴,不过和上面的方法不一样的是,这个是通过主线程的looper来实现的


    1. new Thread(new Runnable() {  
    2.             public void run() {  
    3.                 Handler handler = new Handler(Looper.getMainLooper()){ // 区别在这!!!!  
    4.                     @Override  
    5.                     public void handleMessage(Message msg) {  
    6.                         Toast.makeText(getApplicationContext(), "handler msg", Toast.LENGTH_LONG).show();  
    7.                     }  
    8.                 };  
    9.                 handler.sendEmptyMessage(1);  
    10.             };  
    11.         }).start();  


    大家如果有业务需要在子线程处理消息,用以上任意一种方法都是可以的。


    展开全文
  • 子线程控制主线程中的组件使用handler 比较好,但有时也可以用下面的方法来实现同样的效果: 此处是demo public class MainActivity extends Activity { private ImageView IV; private Button addBtn; @...

    子线程控制主线程中的组件使用handler 比较好,但有时也可以用下面的方法来实现同样的效果:

    此处是demo

    public class MainActivity extends Activity {


    private ImageView IV;
    private Button addBtn;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    IV = (ImageView) findViewById(R.id.iv);
    addBtn = (Button) findViewById(R.id.btnaddpic);
    addBtn.setOnClickListener(new OnClickListener() {


    @Override
    public void onClick(View v) {


    new Thread(new Runnable() {


    @Override
    public void run() {


    // 关键就是使用View.post(Runnable)方法;
    IV.post(new Runnable() {


    @Override
    public void run() {
    IV.setBackgroundColor(Color.RED);


    }
    });


    }
    }).start();


    }
    });


    }


    还有最好使用异步任务类:AsyncTask,这种方法也比较好

    展开全文
  • Android: 子线程创建Handler的两种方法

    千次阅读 2018-12-07 17:00:10
    方式一: 获取主线的looper(UI线程的looper---...此方法是通过主线的looper来实现的,简单使用. //noinspection Convert2Lambda new Thread(new Runnable() { @Override public void run() { Handler ha...

    方式一: 获取主线程的looper(UI线程的looper---Looper.getMainLooper())

    此方法是通过主线程的looper来实现的,简单使用.

    //noinspection Convert2Lambda
    new Thread(new Runnable() {
        @Override
        public void run() {
            Handler handler = new Handler(Looper.getMainLooper()) { //重点在此处
                @Override
                public void handleMessage(Message msg) {
                    Toast.makeText(getApplicationContext(), "handler-msg", Toast.LENGTH_LONG).show();
                }
            };
            handler.sendEmptyMessage(1);
        }
    }).start();

    方式二: 直接获取当前子线程的looper

    new Thread(() -> {
        Looper.prepare();
        @SuppressLint("HandlerLeak")
        Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                Toast.makeText(getApplicationContext(), "handler-msg", Toast.LENGTH_LONG).show();
            }
        };
        handler.sendEmptyMessage(1);
        Looper.loop();
    }).start();

    或  new Thread(new Runnable() {

                @Override
                public void run() {
                    Looper.prepare();
                    Handler handler = new Handler(){
                        @Override
                        public void handleMessage(Message msg) {
                            Toast.makeText(getApplicationContext(), "handler-msg", Toast.LENGTH_LONG).show();
                        }
                    };
                    handler.sendEmptyMessage(1);
                    Looper.loop();
                };
            }).start();

     

    展开全文
  • 主要介绍了android使用handler ui线程和子线程通讯更新ui的方法,大家参考使用吧
  • 关键字:Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程子线程之间) 相信大家平时都有使用到异步线程往主线程(UI线程)发送消息的情况。本文主要研究Handler的消息发送。包括...
  • keyword:Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程子线程之间) 相信大家平时都有使用到异步线程往主线程(UI线程)发送消息的情况。本文主要研究Handler的消息发送。...
  • 使用handler进行子线程之间通信
  • Android子线程间通信

    2017-06-15 20:12:15
    Android子线程间通信 looper默认存在于主线程中,在子线程和主线程通信时,子线程通过主线程中的handler发送消息给主线程的messageQueen消息队列,通过主线程中的looper取出,在handleMessage方法里可以使用...
  • 转载:https://blog.csdn.net/shaoenxiao/article/details/54561753今天这篇文章只讲一下怎么使用Handler实现子线程与子线程之间、子线程...
  • 转载:https://blog.csdn.net/shaoenxiao/article/details/54561753今天这篇文章只讲一下怎么使用Handler实现子线程与子线程之间、子线程与主线程之间如何进行通信,关于具体的内部实现因为我也没研究过,所以这篇...
  • android 子线程 Toast

    2015-02-02 15:01:12
    android子线程中不能使用Toast,否则会报错,但可以用这种方法来实现。 在onCreate中, private Handler mbUiThreadHandler = new Handler(); Thread workThread = new Thread(new Runnable(){ @...
  • 1 package com.act262.sockettx; 2 3 import android.app.Activity; 4 import android.os.Bundle; ... 5 import android.os.Handler; 6 import android.os.Message; 7 import android.view.V...
  • Android子线程主线程之间的通信

    千次阅读 2013-08-16 09:21:38
    Android系统属于单线程模型,子线程不能控制UI主线程。 关键词:Androidhandler,aysncTask 1. 前言 1.1 Android主线程 在一个Android 程序开始运行的时候,会单独启动一个Process。默认的情况下,所有这个程序中...
  • 本文介绍了如下内容: 1、如何创建一个handler对象并使其与子线程挂钩; 2、HandlerThread的作用以及使用方法。
  • 上一篇讲解了Handler的处理机制,但是没有给例子,这次就给个例子 先看效果图: 我没隔3秒就换个图片 布局: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=...
  • 如果不熟悉或者忘记了,请参考我的这篇博客Android之用Handler实现主线程和子线程互相通信以及子线程和子线程之间的通信 2、贴上简单HandlerThread简单使用(主线程和子线程通信、子线程子线程通信)的例子...
  • 核心思想:为子线程手动创建looper对象,绑定mQueue,建立持有这个mQueue的handler对象,并调用looper.loop()方法阻塞线程,等待接收到消息后交给handler处理,使用完成后要调用looper.quit()结束线程,释放资源 ...
  • 我们知道,每个eActivity都有一个Main线程,也称之为UI线程,当...现在上代码,demo很简单,使用子线程更新Textview显示从update_0到update_49。public class MainActivity extends AppCompatActivity { private stati
  • 子线程如何简单的使用Handler更新UI 问题: android开发时,如何在子线程更新UI? Handler: UI线程主要负责监听UI控件用户输入,进行事件的分发,事件的相应管理。当我们在子线程做完工作之后,由于子线程...
  • 基础篇Handler使用一般会先创建内部类继承Handler,重写...Frameworks/base/core/java/android/os/Handler.java 810行Handler用来发送和处理消息。Handler的构造方法,方法一是使用当前线程的Looper,...
  • handler在主线中定义,子线程中往主线发消息,消息不空,但是主线中无法获取到 代码如下: 主线: if (conn == null) { conn = new ConnectServer(msg,LoginActivity.this); Log.e(TAG, "成功...
  • Android中,主线中的组件,不能被子线程调用,否则就会出现异常。  这里所使用的方法就是利用Handler类中的Callback(),接受线程中的Message类发来的消息,然后把所要在线程中执行的功能交由Handler类来处理。...
  • 我们都知道,网络请求要在子线程中执行,那么它的成功和失败回调自然也是在...我们可以使用Handler。 在子线程中 Message message = new Message(); message.what = HANDLE_MSG; Bundle bundle = new Bundle()...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 813
精华内容 325
关键字:

android子线程使用handler