`
raymond.chen
  • 浏览: 1426546 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Android Handler:子线程发消息到UI主线程

 
阅读更多

Activity代码:

public class MainActivity extends Activity {
    private MyThread myThread;
    private Handler handler; //子线程与UI主线程进行消息通信

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //通过Handler获取子线程推送过来的消息
		handler = new Handler(){
			@Override
			public void handleMessage(Message msg) {
				super.handleMessage(msg);
				Bundle bundle = msg.getData();
				String value = bundle.getString("value");
				outputEditText.setText(value);
			}
		};

		//启动一个子线程
		myThread = new MyThread(handler);
		myThread.start();

		showDialog("Socket Thread Started!");
    }

    /**
     * 对话框显示
     */
    private void showDialog(String msg){
        new AlertDialog.Builder(this)
                .setTitle("提示")
                .setMessage(msg)
                .setPositiveButton("ok", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        }).show();
    }
}

 

Thread代码:

public class MyThread extends Thread{
    private Handler handler;

    public MyThread(Handler handler){
        this.handler = handler;
    }

    @Override
    public void run() {
        try {
            //持续向UI主线程发送当前日期时间
            while(true){
                TimeUnit.MILLISECONDS.sleep(1000);

                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String date = sdf.format(new Date());

                sendMessage(date);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 向UI主线程发送消息
     */
    private void sendMessage(String msg){
        Bundle data = new Bundle();
        data.putString("value", msg);

        Message message = new Message();
        message.setData(data);

        this.handler.sendMessage(message);
    }
}

 

需要刷新UI时的Handle实例化:

        在主线程中: Handler handler = new Handler();

        在其他线程中: Handler handler = new Handler(Looper.getMainLooper());

 

不用刷新UI时的Handle实例化:

        在主线程中: Handler handler = new Handler();

        在其他线程中: 

                Looper.prepare(); 

                Handler handler = new Handler();

                Looper.loop();

 

                或者

 

                Handler handler = new Handler(Looper.getMainLooper());

 

        message.what一般用于区别消息的。进程内传递数据可用setData(Bundle),进程间要用message.obj传递可序列化对象数据

 

分享到:
评论

相关推荐

    android 主线程给子线程发送消息

    本示例"android 主线程给子线程发送消息"是通过`Handler`机制来实现通信的,这是一个关键的多线程同步技术。 `Handler`是Android中用于在线程间传递消息和调度任务的工具,尤其是主线程与工作线程之间的通信。下面...

    安卓UI线程和子线程通讯更新UI实例

    在Android应用开发中,UI线程(也称为主线程)负责处理用户交互和绘制界面,而子线程通常用于执行耗时操作,如网络请求、数据处理等。由于Android系统的安全机制,直接在子线程中修改UI是不允许的,因此我们需要通过...

    Android两个子线程之间的通信

    1. **Handler-Message机制**:这是最常用的一种方式,通过创建Handler对象,一个线程(通常是主线程)注册Handler,另一个线程发送Message到MessageQueue,Handler会接收到Message并处理。这种方式适用于需要在特定...

    子线程更新主线程数据

    - Looper: 这是Android主线程的一个消息循环,它不断地从消息队列中取出Message并分发给对应的Handler进行处理。 - MessageQueue: 消息队列,存储待处理的消息。 2. iOS中的GCD (Grand Central Dispatch) 和...

    子线程接收主线程发送的消息

    标题“子线程接收主线程发送的消息”涉及到的是Android中的Handler机制,这是一种处理线程间通信的方式。我们首先来详细解释一下Handler、Looper和Message这三个关键组件。 **Handler** 是一个消息处理对象,它与...

    android主线程、子线程及线程间通信方式测试app

    本文将深入探讨Android主线程(也称为UI线程)、子线程以及它们之间的通信方式,结合"android主线程、子线程及线程间通信方式测试app"的描述,我们将详细分析相关知识点。 1. **Android主线程**:主线程是应用程序...

    子线程和主线程通过handler 双向通信

    2. **子线程向主线程发送消息**:在子线程(这里是指HandlerThread)中,同样创建一个Handler,但这个Handler需要关联到主线程的Looper。子线程中的任务完成后,可以通过这个Handler发送Message回主线程。 3. **...

    Android_子线程创建消息队列更新UI

    通过这样的方式,我们可以在子线程处理数据后,通过消息机制将结果传递到主线程,由主线程安全地更新UI。 此外,还有一种常见的替代方案是使用`AsyncTask`类,它同样支持在后台线程执行任务并在适当的时候更新UI。...

    android Handler子线程计算斐波那契数列

    主线程的Handler接收到Message后,会在`handleMessage(Message msg)`方法中处理这个消息。这里可以将结果解析出来,并更新UI。 以下是一个简单的代码示例: ```java public class MainActivity extends ...

    子线程和主线程5种交互方式 Demo

    Handler是Android中一种常用的消息机制,它允许我们在子线程中创建,并通过Looper在主线程中分发消息或Runnable对象。创建Handler时,需要指定Looper,通常在主线程中默认就有Looper。子线程通过post(Runnable)或...

    【Android开发入门】Android线程之Handler

    例如,在工作线程中执行耗时操作,完成后通过Handler向主线程发送消息,主线程接收到消息后更新UI。这样,既保证了UI的流畅性,又实现了后台任务的执行。 六、Handler的最佳实践 1. 避免内存泄漏:Handler的引用...

    Android-dialog库可以在任意类内调用子线程或ui线程内均可显示

    Android-dialog库针对这些需求进行了优化,提供了更简洁的API,允许开发者在子线程中预处理Dialog的相关数据,然后在合适的时候切换到主线程进行显示,避免了阻塞UI。这种设计遵循了Android的异步编程原则,使得代码...

    安卓UI线程机制 ,在子线程中访问UI

    1. 主线程:每个Android应用都有一个主线程,它负责初始化Activity、BroadcastReceiver、Service等组件,并处理来自用户的输入事件。主线程遵循单线程模型,确保UI组件的操作按顺序执行,避免了竞态条件和不必要的...

    子线程中更新UI线程的三种方法

    在Android开发中,由于UI操作必须在主线程中执行,因此当我们在子线程中处理数据后,需要将结果安全地传递到主线程进行UI更新。以下将详细讲解三种在子线程中更新UI线程的方法,特别是Handler的两种用法。 1. ...

    android-Handler的使用

    子线程通过调用 `sendMessage()` 或 `post()` 方法将 `Message` 对象或 `Runnable` 对象发送到 Handler,这些对象随后会被添加到主线程的消息队列中。主线程中的 Looper 循环不断地取出队列中的消息并交给关联的 ...

    android 子线程URL加载网络图片

    - Handler通常与Looper和Message配合使用,允许子线程向主线程发送消息,进而更新UI。 - Looper是消息循环器,用于处理MessageQueue中的消息,通常主线程默认有Looper,子线程需要手动添加。 3. **AsyncTask**: ...

    子线程控制ProgressDialog的可见性

    在主线程中创建一个Handler,并在子线程中通过这个Handler发送消息来控制ProgressDialog的显示和消失。 以下是实现这一功能的基本步骤: 1. 在主线程中创建一个Handler实例,重写handleMessage()方法,用于处理子...

    android中UI主线程与子线程深入分析

    在Android应用程序开发中,理解和掌握UI主线程与子线程的使用至关重要,因为它们直接影响到应用的性能和用户体验。UI主线程,也称为应用程序主线程或活动线程,是每个Android应用的核心部分,主要负责处理用户界面的...

    子线程中更新UI的三种方法和获取message的两种方法总结

    主线程中的Looper会接收到这个Message并交给Handler进行处理,从而在主线程中更新UI。 2. **RunOnUiThread** Android提供了`runOnUiThread`这个便捷的方法,可以直接在子线程中调用,将一个Runnable对象放入主线程...

    Android 线程+View的使用

    创建一个Handler实例,然后在子线程中通过这个Handler发送Message,主线程中的Handler会接收到这个Message并执行相应的回调方法,从而在主线程中更新UI。具体步骤如下: 1. 创建Handler实例: ```java Handler ...

Global site tag (gtag.js) - Google Analytics