Discuz! BBS

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 97|回复: 1

多线程附带回调函数

[复制链接]

393

主题

556

帖子

3296

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3296
发表于 2025-10-11 00:47:35 | 显示全部楼层 |阅读模式
android 多线程附带回调函数实现:
  1.     public interface TranslationCallback {
  2.         void onTranslationComplete(String result);
  3.     }
复制代码


多线程:
  1.     public void doBackgroundWork(TranslationCallback callback) {
  2.         // TODO: do your background work here
  3.         new Thread(new Runnable() {
  4.             @Override
  5.             public void run() {
  6.                 String textToLlm = getDataToLlm();
  7.                 resultTranslate = Translate(textToLlm);
  8.                 //resultTranslate = TranslateTest(textToLlm);
  9.                 Log.d("BackgroundService", "resultTranslate:  " + resultTranslate);

  10.                 //通过回调返回结果
  11.                 if (callback != null) {
  12.                     runOnUiThread(new Runnable() {    //注意这里!
  13.                         @Override
  14.                         public void run() {
  15.                             callback.onTranslationComplete(resultTranslate);
  16.                         }
  17.                     });
  18.                 }
  19.                 // 清空数据,以便下次使用
  20.                 setDataToLlm("");
  21.             }
  22.         }).start();
  23.     }
复制代码

这里是必须要用runOnUiThread主线程执行吗?
结论
是的,在这种情况下必须使用 runOnUiThread
原因分析
1、线程安全性: doBackgroundWork 方法在后台线程中执行,而 UI 更新必须在主线程中进行
2、Android UI 限制: Android 系统要求所有 UI 操作都在主线程(UI线程)中执行,否则会抛出 CalledFromWrongThreadException 异常
代码说明

  1. // 在后台线程中执行翻译工作
  2. new Thread(new Runnable() {
  3.     @Override
  4.     public void run() {
  5.         // ... 翻译逻辑 ...
  6.         
  7.         // 回调可能涉及UI更新,所以需要切换到主线程
  8.         if (callback != null) {
  9.             runOnUiThread(new Runnable() {
  10.                 @Override
  11.                 public void run() {
  12.                     callback.onTranslationComplete(resultTranslate);
  13.                 }
  14.             });
  15.         }
  16.     }
  17. }).start();
复制代码
替代方案
如果不使用 runOnUiThread,也可以考虑:
1、使用 Handler 切换到主线程
2、使用 AsyncTask(已废弃但仍可用)
3、使用 ExecutorService 配合 Handler
但在当前实现中,runOnUiThread 是最合适的选择。


参考其功能的调用(MainActivity):
  1.         //使用回调函数获取翻译结果
  2.         mService.doBackgroundWork(result -> {
  3.             runOnUiThread(() -> {
  4.                 if (result != null && result.length() > 0){
  5.                     mResultText.append("\n" + result + "\n");  // 每次新加mResultText都空一行。(空行)。
  6.                 }
复制代码

这里也是使用主线程(UiThread)。
回复

使用道具 举报

393

主题

556

帖子

3296

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3296
 楼主| 发表于 2025-10-11 00:51:44 | 显示全部楼层
一个多线程的例子:

多线程是编程中的一个重要概念,它允许程序同时执行多个任务。以下是一个简单的多线程例子
  1. public class MultiThreadExample {
  2.     public static void main(String[] args) {
  3.         // 创建并启动第一个线程
  4.         Thread thread1 = new Thread(() -> {
  5.             for (int i = 0; i < 5; i++) {
  6.                 System.out.println("Thread 1: " + i);
  7.                 try {
  8.                     Thread.sleep(1000); // 暂停1秒
  9.                 } catch (InterruptedException e) {
  10.                     e.printStackTrace();
  11.                 }
  12.             }
  13.         });

  14.         // 创建并启动第二个线程
  15.         Thread thread2 = new Thread(() -> {
  16.             for (int i = 0; i < 5; i++) {
  17.                 System.out.println("Thread 2: " + i);
  18.                 try {
  19.                     Thread.sleep(1000); // 暂停1秒
  20.                 } catch (InterruptedException e) {
  21.                     e.printStackTrace();
  22.                 }
  23.             }
  24.         });

  25.         // 启动线程
  26.         thread1.start();
  27.         thread2.start();
  28.     }
  29. }
复制代码


在这个例子中:
1、我们创建了两个线程 thread1 和 thread2
2、每个线程都执行一个循环,打印数字并暂停一秒
3、两个线程会并发执行,输出结果会交替显示
4、使用 Thread.sleep() 来模拟耗时操作
这个例子展示了多线程的基本用法,实际应用中还需要考虑线程同步、资源共享等问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2025-10-25 10:54 , Processed in 0.011619 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表