Activity与Thread之间的通讯

本文介绍如何在Android中实现Activity与Thread之间的通讯。通过整合使用Handler、Thread及Message类,可以实现在后台线程更新UI的功能。文章提供了一个定时更新时间显示的例子。

在Android中要让Activity与Thread进行通讯 其实很简单。
重点就在于android .os.Handler、java.lang.Thread以及android.os.Message这三个类的整合应用
我们在Thread中可以通过Message来通知Handler,Handler在这里扮演着联系Acitivity与Thread之间的角色。


首先在Acitivity中我们要定义 一个常量来作为判断标示

  1. private static final int GUINOTIFIER = 0x1234;
复制代码

然后定义一些例子 里面需要的属性

  1. public Calendar mCalendar;
  2. public int mMinutes;
  3. public int mHour;
  4. public Handler mHandler;
  5. private Thread mClockThread;
复制代码

接着我们通过Handler来接收Thread所传递的信息

  1. mHandler = new Handler() {
  2.             public void handleMessage(Message msg) {
  3.                 switch (msg.what) {
  4.                     case TestHandler.GUINOTIFIER://TestHandler是Activity的类名
  5.                         //得到Handle的通知了 这个时候你可以做相应的操作,本例是使用TextView 来显示时间
  6.                         mTextView .setText(mHour + " : " + mMinutes);
  7.                         break;
  8.                 }
  9.                 super.handleMessage(msg);
  10.             }
  11.         };
复制代码

接下来我们自定义一个Thread

  1. class LooperThread extends Thread {
  2.         public void run() {
  3.             super.run();
  4.             try {
  5.                 do {//每间隔一秒取一次系统 时间
  6.                     long time = System.currentTimeMillis();
  7.                     final Calendar mCalendar = Calendar.getInstance();
  8.                     mCalendar.setTimeInMillis(time);
  9.                     mHour = mCalendar.get(Calendar.HOUR);
  10.                     mMinutes = mCalendar.get(Calendar.MINUTE);
  11.                     Thread.sleep(1000);
  12.                     //取得系统时间后发送消息给Handler
  13.                     Message m = new Message();
  14.                     m.what = Ex04_14.GUINOTIFIER;
  15.                     Ex04_14.this.mHandler.sendMessage(m);
  16.                 } while (!LooperThread.interrupted());//当系统发出终端命令时停止循环
  17.             } catch (InterruptedException e) {
  18.                 e.printStackTrace();
  19.             }
  20.         }
  21.     }
复制代码

最后我们启动线程

  1. mClockThread = new LooperThread();
  2. mClockThread.start();
复制代码

利用上面的例子我们可以扩展更多的应用,比如使用Thread进行上传下载 操作,完成后通知主Activity等等

### ### 定义回调接口 在 Android 开发中,回调接口通常以接口的形式定义,其中包含一个或多个方法,用于在特定事件发生时通知调用方。例如,可以定义如下接口: ```java public interface MyCallback { void onSuccess(String result); void onFailure(Exception error); } ``` 该接口可以用于处理异步操作的结果,例如网络请求或数据库查询的结果回调 [^1]。 ### 实现回调逻辑 在定义接口后,需要在一个中持有该接口的引用,并在适当的时机调用接口方法。例如,一个用于执行异步任务的可以如下实现: ```java public class AsyncDataLoader { private MyCallback callback; public void setCallback(MyCallback callback) { this.callback = callback; } public void loadData() { new Thread(() -> { try { Thread.sleep(1500); // 模拟网络延迟 if (callback != null) { callback.onSuccess("数据加载成功"); } } catch (InterruptedException e) { if (callback != null) { callback.onFailure(e); } } }).start(); } } ``` 通过 `setCallback` 方法设置回调接口的实例,并在模拟异步操作完成后调用 `onSuccess` 或 `onFailure` 方法通知调用方 [^2]。 ### 使用回调接口 在使用时,需要创建接口的实现对象,并将其传递给需要执行异步任务的。例如,在 `Activity` 中可以这样使用: ```java AsyncDataLoader loader = new AsyncDataLoader(); loader.setCallback(new MyCallback() { @Override public void onSuccess(String result) { // 处理成功结果 Log.d("Callback", result); } @Override public void onFailure(Exception error) { // 处理错误 Log.e("Callback", "加载失败", error); } }); loader.loadData(); ``` 通过这种方式,可以实现组件之间的解耦,并确保异步操作的结果能够安全地传递给调用者 [^3]。 ### Kotlin 中的回调实现 在 Kotlin 中,可以通过接口定义回调方法,也可以使用 lambda 表达式简化代码。例如: ```kotlin interface MyCallback { fun onSuccess(result: String) fun onFailure(error: Exception) } class AsyncDataLoaderKt { private var callback: MyCallback? = null fun setCallback(callback: MyCallback) { this.callback = callback } fun loadData() { Thread { try { Thread.sleep(1500) callback?.onSuccess("数据加载成功") } catch (e: InterruptedException) { callback?.onFailure(e) } }.start() } } ``` 使用时可以传入 lambda 表达式实现接口方法,提升代码的简洁性和可读性 [^3]。 ### 注意事项 - **生命周期管理**:确保在组件销毁时解除回调引用,避免内存泄漏。 - **线程安全**:如果回调涉及 UI 更新,应确保在主线程中执行,例如使用 `runOnUiThread` 或 `Handler`。 - **空指针检查**:在调用回调方法前应检查接口实例是否为 null,防止程序崩溃。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值