设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间00 现在时间00 缓存数据 所有没能打败你的东西,都将使你变得强大。你要做个可爱的姑娘,不烦世事,满心欢喜!晚安!

所有没能打败你的东西,都将使你变得强大。你要做个可爱的姑娘,不烦世事,满心欢喜!晚安!

查看: 1257|回复: 3

详解Android的Handler机制原理

[复制链接]

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
27
主题
23
精华
0
金钱
83
积分
50
注册时间
2023-10-3
最后登录
2025-5-23

发表于 2024-2-25 11:45:57 | 显示全部楼层 |阅读模式
目录


  • 以下是Android Handler机制的主要组成部分和工作原理:
  • Handler机制的工作流程:
  • Handler 的三种使用方法,分别是:

    • 1. Handler.sendMessage()方法

      • 1.1 使用步骤说明

    • 2. Handler.post()方法

      • 2.1 Java版本的具体代码如下
      • 2.2 Kotlin版本的具体代码如下:

    • 3. obtainMessage()方法

      • 3.1 Java版本的具体代码如下:
      • 3.2 Kotlin版本的具体代码如下:

    • 4. 总结:

      • 4.1 在子线程中创建Handler



以下是Android Handler机制的主要组成部分和工作原理:

1.Message(消息):Message是一个包含要传递的数据和指令的对象。它可以携带整数、字符串、Bundle等不同类型的数据。当需要在不同线程之间传递数据或执行任务时,通常会创建一个Message并将其发送给Handler。
2.Handler(处理程序):Handler是用于处理Message的对象。它通常与一个特定的线程(通常是主线程)关联。通过Handler,您可以将Message发送到与其关联的线程的消息队列中,以便在那个线程中执行处理。
3.Looper(消息循环器):Looper是一个用于管理线程的消息队列的对象。每个线程都可以有一个Looper,它会在线程上创建一个消息队列,允许该线程接收并处理Message。主线程通常已经具有一个默认的Looper,而后台线程需要显式创建一个Looper。
4.MessageQueue(消息队列):MessageQueue是一个FIFO(先进先出)队列,用于存储待处理的Message。每个Looper都有一个关联的MessageQueue,Handler将Message发送到这个队列中,然后由Looper依次处理队列中的Message。

Handler机制的工作流程:

1.在主线程(或其他线程)上创建一个Handler对象,这个Handler会关联到当前线程的Looper。
2.在后台线程中,创建一个Message对象,可以将一些数据和处理指令放入这个Message。
3.使用Handler的sendMessage方法将Message发送到与Handler关联的Looper的MessageQueue中。
4.Looper在后台线程中不断轮询MessageQueue,当有新的Message到达时,将Message取出并交给Handler处理。
5.Handler收到Message后,可以根据Message中的指令执行相应的操作,通常是在主线程中更新UI。
6.如果需要定时任务或循环执行,可以使用Handler的postDelayed方法。

Handler 的三种使用方法,分别是:

Handler.sendMessage(Message)
Handler.post(Runnable)
Handler.obtainMessage(what).sendToTarget();

1. Handler.sendMessage()方法

Handler.sendMessage(Msg) 方法是最为常见的一种方法。

1.1 使用步骤说明

其使用步骤分四步,如下所示:
1、步骤一:新建 Handler 对象,覆写 handleMessage(Message) 方法。
2、步骤二:新建 Message 对象,设置其携带的数据。
3、步骤三:在子线程中通过 Handler.sendMessage(Message) 方法发送信息。
4、步骤四:在 Handler 的 handleMessage(Message msg) 方法中处理消息,通知主线程作出相对应的 UI 工作。
步骤一:新建 Handler 对象,覆写 handleMessage(Message) 方法
  1. //创建 Handler对象,并关联主线程消息队列
  2. mHandler = new Handler(Looper.getMainLooper()) {
  3.     @Override
  4.     public void handleMessage(Message msg) {
  5.         super.handleMessage(msg);
  6.             ···略···
  7.         }
  8.     }
  9. };
复制代码
步骤二:新建 Message 对象,设置其携带的数据
  1. Bundle bundle = new Bundle();
  2. bundle.putInt(CURRENT_PROCESS_KEY, i);
  3. Message msg = new Message();
  4. msg.setData(bundle);
  5. msg.what = 2;
复制代码
步骤三:在子线程中通过 Handler.sendMessage(Message) 方法发送信息
  1. mHandler.sendMessage(msg)
复制代码
步骤四:在 Handler 的 handleMessage(Message msg) 方法中处理消息,通知主线程作出相对应的 UI 工作
  1. mHandler = new Handler(Looper.getMainLooper()) {
  2.     @Override
  3.     public void handleMessage(Message msg) {
  4.         super.handleMessage(msg);
  5.         //根据信息编码及数据做出相对应的处理
  6.         switch (msg.what) {
  7.             case 1:
  8.                 //更新 TextView UI
  9.                 mDisplayTv.setText("CustomChildThread starting!");
  10.                 break;
  11.             case 2:
  12.                 //获取 ProgressBar 的进度,然后显示进度值
  13.                 Bundle bundle = msg.getData();
  14.                 int process = bundle.getInt(CURRENT_PROCESS_KEY);
  15.                 mProgressBar.setProgress(process);
  16.                 break;
  17.             default:
  18.                 break;
  19.         }
  20.     }
  21. };
复制代码
1.2.1Java版本的具体代码如下所示:
  1. public class HandlerAddThreadActivity extends AppCompatActivity {
  2.     public static final String CURRENT_PROCESS_KEY = "CURRENT_PROCESS";
  3.     private TextView mDisplayTv;
  4.     private Handler mHandler;
  5.     private ProgressBar mProgressBar;

  6.     @Override
  7.     protected void onCreate(Bundle savedInstanceState) {
  8.         super.onCreate(savedInstanceState);
  9.         setContentView(R.layout.activity_handler_add_thread);

  10.         TextView titleTv = findViewById(R.id.title_tv);
  11.         titleTv.setText("Handler + Thread");
  12.         
  13.         mDisplayTv = findViewById(R.id.display_tv);
  14.         mProgressBar = findViewById(R.id.test_handler_progress_bar);

  15.         //mHandler用于处理主线程消息队列中的子线程消息
  16.         mHandler = new Handler(Looper.getMainLooper()) {
  17.             @Override
  18.             public void handleMessage(Message msg) {
  19.                 super.handleMessage(msg);
  20.                 switch (msg.what) {
  21.                     case 1:
  22.                         //更新 TextView UI
  23.                         mDisplayTv.setText("CustomChildThread starting!");
  24.                         break;
  25.                     case 2:
  26.                         //获取 ProgressBar 的进度,然后显示进度值
  27.                         Bundle bundle = msg.getData();
  28.                         int process = bundle.getInt(CURRENT_PROCESS_KEY);
  29.                         mProgressBar.setProgress(process);
  30.                         break;
  31.                     default:
  32.                         break;
  33.                 }

  34.             }
  35.         };
  36.         
  37.         Button mClickBtn = findViewById(R.id.click_btn);
  38.         mClickBtn.setOnClickListener(new View.OnClickListener() {
  39.             @Override
  40.             public void onClick(View view) {
  41.                 //开启子线程,子线程处理UI工作
  42.                 CustomChildThread customThread = new CustomChildThread();
  43.                 customThread.start();
  44.             }
  45.         });
  46.     }

  47.     /**
  48.      * 子线程,用于处理耗时工作
  49.      */
  50.     public class CustomChildThread extends Thread {

  51.         @Override
  52.         public void run() {
  53.             //在子线程中创建一个消息对象
  54.             Message childThreadMessage = new Message();
  55.             childThreadMessage.what = 1;
  56.             //将该消息放入主线程的消息队列中
  57.             mHandler.sendMessage(childThreadMessage);

  58.             //模拟耗时进度,将进度值传给主线程用于更新 ProgressBar 进度。
  59.             for (int i = 1; i <= 5; i++) {
  60.                 try {
  61.                     //让当前执行的线程(即 CustomChildThread)睡眠 1s
  62.                     Thread.sleep(1000);

  63.                     //Message 传递参数
  64.                     Bundle bundle = new Bundle();
  65.                     bundle.putInt(CURRENT_PROCESS_KEY, i);
  66.                     Message progressBarProcessMsg = new Message();
  67.                     progressBarProcessMsg.setData(bundle);
  68.                     progressBarProcessMsg.what = 2;
  69.                     mHandler.sendMessage(progressBarProcessMsg);
  70.                 } catch (InterruptedException e) {
  71.                     e.printStackTrace();
  72.                 }
  73.             }
  74.         }
  75.     }
  76. }
复制代码
1.2.2Kotlin版本的代码如下所示:
  1. class TestThreadAddHandlerActivity : AppCompatActivity() {
  2.     companion object {
  3.         const val PROGRESS_VALUE_KEY = "PROGRESS_VALUE"
  4.     }

  5.     override fun onCreate(savedInstanceState: Bundle?) {
  6.         super.onCreate(savedInstanceState)
  7.         setContentView(R.layout.activity_thread_add_handler)

  8.         handlerAddThreadStartBtn.setOnClickListener(View.OnClickListener {
  9.             //工作线程开始模拟下载任务
  10.             val workThread: WorkThread = WorkThread(this)
  11.             workThread.start()
  12.         })
  13.     }

  14.     class WorkThread(activity: TestThreadAddHandlerActivity) : Thread() {
  15.         private var handler: MyHandler = MyHandler(activity)

  16.         override fun run() {
  17.             super.run()
  18.             for (i in 0..6) {
  19.                 sleep(1000)
  20.                 //通过 Handler 将进度参数传递给 主线程,让其更新 progressBar 进度
  21.                 val message = Message()
  22.                 message.what = 1
  23.                 val bundle = Bundle()
  24.                 bundle.putInt(PROGRESS_VALUE_KEY, i)
  25.                 message.data = bundle
  26.                 handler.sendMessage(message)
  27.             }
  28.         }
  29.     }

  30.     /**
  31.      * 静态内部类,防止内存泄漏
  32.      */
  33.     class MyHandler(activity: TestThreadAddHandlerActivity) : Handler() {
  34.         private var weakReference = WeakReference(activity)

  35.         override fun handleMessage(msg: Message) {
  36.             super.handleMessage(msg)
  37.             //处理消息
  38.             when (msg.what) {
  39.                 1 -> {
  40.                     val activity = weakReference.get()
  41.                     if (activity != null && !activity.isFinishing) {
  42.                         //获取消息中携带的任务处理进度参数,然后设置成 ProgressBar 的进度。
  43.                         val progressValue: Int = msg.data.get(PROGRESS_VALUE_KEY) as Int
  44.                         activity.handlerAddThreadProgressBar.progress = progressValue
  45.                     }
  46.                 }
  47.             }
  48.         }
  49.     }
  50. }
复制代码
2. Handler.post()方法

除了使用 Handler.sendMessage(Message) 来发送信息,Handler 还支持 post(Runnable) 方法来传递消息,通知主线程做出相对应的 UI 工作。使用方法如下:
  1. /**
  2. * 将可运行的 Runnable 添加到消息队列。Runnable 将在该 Handler 相关的线程上运行处理。
  3. * The runnable will be run on the thread to which this handler is attached.
  4. */
  5. new Handler().post(new Runnable() {
  6.     @Override
  7.     public void run() {
  8.         //更新处理 UI 工作
  9.     }
  10. });
复制代码
2.1 Java版本的具体代码如下
  1. public class HandlerPostFunctionActivity extends AppCompatActivity {
  2.     private Handler mMainHandler;
  3.     private ProgressBar mProgressBar;

  4.     @Override
  5.     protected void onCreate(Bundle savedInstanceState) {
  6.         super.onCreate(savedInstanceState);
  7.         setContentView(R.layout.activity_handler_add_thread);

  8.         TextView titleTv = findViewById(R.id.title_tv);
  9.         titleTv.setText("Handler post() function");

  10.         mProgressBar = findViewById(R.id.test_handler_progress_bar);

  11.         //新建静态内部类 Handler 对象
  12.         mMainHandler = new Handler(getMainLooper());

  13.         Button mClickBtn = findViewById(R.id.click_btn);
  14.         mClickBtn.setOnClickListener(new View.OnClickListener() {
  15.             @Override
  16.             public void onClick(View view) {
  17.                 //开启子线程,子线程处理UI工作
  18.                 CustomChildThread customThread = new CustomChildThread();
  19.                 customThread.start();
  20.             }
  21.         });
  22.     }

  23.     /**
  24.      * 子线程,用于处理耗时工作
  25.      */
  26.     public class CustomChildThread extends Thread {

  27.         @Override
  28.         public void run() {
  29.             //模拟耗时进度,将进度值传给主线程用于更新 ProgressBar 进度。
  30.             for (int i = 1; i <= 5; i++) {
  31.                 try {
  32.                     //让当前执行的线程(即 CustomChildThread)睡眠 1s
  33.                     Thread.sleep(1000);

  34.                     //新创建一个 Runnable 用户处理 UI 工作
  35.                     MyRunnable runnable = new MyRunnable(HandlerPostFunctionActivity.this, i);
  36.                     //调用Handler post 方法。
  37.                     mMainHandler.post(runnable);
  38.                 } catch (InterruptedException e) {
  39.                     e.printStackTrace();
  40.                 }
  41.             }
  42.         }
  43.     }

  44.     /**
  45.      * 将 Runnable 写成静态内部类,防止内存泄露
  46.      */
  47.     public static class MyRunnable implements Runnable {
  48.         private int progressBarValue;
  49.         private WeakReference<HandlerPostFunctionActivity> weakReference;

  50.         MyRunnable(HandlerPostFunctionActivity activity, int value) {
  51.             this.weakReference = new WeakReference<>(activity);
  52.             this.progressBarValue = value;
  53.         }

  54.         @Override
  55.         public void run() {
  56.             HandlerPostFunctionActivity activity = weakReference.get();
  57.             if (activity != null && !activity.isFinishing()) {
  58.                 activity.mProgressBar.setProgress(progressBarValue);
  59.             }
  60.         }
  61.     }
  62. }
复制代码
2.2 Kotlin版本的具体代码如下:
  1. class TestHandlerPostRunnableActivity : AppCompatActivity() {
  2.     private var mMainHandler: Handler? = null

  3.     override fun onCreate(savedInstanceState: Bundle?) {
  4.         super.onCreate(savedInstanceState)
  5.         setContentView(R.layout.activity_thread_add_handler)

  6.         handlerAddThreadStartBtn.setOnClickListener(View.OnClickListener {
  7.             //工作线程开始模拟下载任务
  8.             val workThread: WorkThread = WorkThread(this)
  9.             workThread.start()
  10.         })

  11.         //创建 Handler,关联App的 主Looper 对象
  12.         mMainHandler = Handler(Looper.getMainLooper())
  13.     }

  14.     class WorkThread(private var activity: TestHandlerPostRunnableActivity) : Thread() {
  15.         private var handler: Handler? = activity.mMainHandler

  16.         override fun run() {
  17.             super.run()
  18.             for (i in 0..6) {
  19.                 sleep(1000)
  20.                 //新建 Runnable 设置进度参数传,然后通过 post(Runnable) 方法,让其更新 progressBar 进度
  21.                 val runnable: MyRunnable = MyRunnable(activity, i)
  22.                 handler?.post(runnable)
  23.             }
  24.         }
  25.     }

  26.     /**
  27.      * 处理 UI 工作。
  28.      * 静态内部类,防止内存泄露
  29.      */
  30.     class MyRunnable(activity: TestHandlerPostRunnableActivity, value: Int) : Runnable {
  31.         private var weakReference = WeakReference(activity)
  32.         private var progressValue = value

  33.         override fun run() {
  34.             val activity = weakReference.get()
  35.             if (activity != null && !activity.isFinishing) {
  36.                 //获取任务执行进度参数,更新 progressBar 进度
  37.                 activity.handlerAddThreadProgressBar.progress = progressValue
  38.             }
  39.         }
  40.     }
  41. }
复制代码
3. obtainMessage()方法

obtainMessage() 方法与 sendMessage() 方法很相似,通过 mHandler.obtainMessage().sendToTarget() 发送信息。该方法与 sendMessage() 的区别就是你不用额外去创建一个 Message 对象。
obtainMessage() 方法有三种,分别是:
  1. //指定 what 用于区分,通过 Message.what 获得
  2. public final Message obtainMessage(int what);

  3. //传递obj参数,通过 Message.obj 获得
  4. public final Message obtainMessage(int what, @Nullable Object obj)

  5. //传递arg1 arg2参数,通过 Message.arg1 Message.arg2 获得
  6. public final Message obtainMessage(int what, int arg1, int arg2)
复制代码
3.1 Java版本的具体代码如下:
  1. public class HandlerObtainMessageActivity extends AppCompatActivity {
  2.     private TextView mDisplayTv;
  3.     private Handler mHandler;
  4.     private ProgressBar mProgressBar;

  5.     @Override
  6.     protected void onCreate(Bundle savedInstanceState) {
  7.         super.onCreate(savedInstanceState);
  8.         setContentView(R.layout.activity_handler_add_thread);

  9.         TextView titleTv = findViewById(R.id.title_tv);
  10.         titleTv.setText("Handler + Thread");

  11.         mDisplayTv = findViewById(R.id.display_tv);
  12.         mProgressBar = findViewById(R.id.test_handler_progress_bar);

  13.         //mHandler用于处理主线程消息队列中的子线程消息
  14.         mHandler = new Handler(Looper.getMainLooper()) {
  15.             @Override
  16.             public void handleMessage(Message msg) {
  17.                 super.handleMessage(msg);
  18.                 switch (msg.what) {
  19.                     case 1:
  20.                         //更新 TextView UI
  21.                         mDisplayTv.setText("Handler obtainMessage() Test!!");
  22.                         break;
  23.                     case 2:
  24.                         //通过 msg.obj 获取 ProgressBar 的进度,然后显示进度值
  25.                         int process = (int) msg.obj;
  26.                         mProgressBar.setProgress(process);
  27.                         break;
  28.                     default:
  29.                         break;
  30.                 }

  31.             }
  32.         };

  33.         Button mClickBtn = findViewById(R.id.click_btn);
  34.         mClickBtn.setOnClickListener(new View.OnClickListener() {
  35.             @Override
  36.             public void onClick(View view) {
  37.                 //开启子线程,子线程处理UI工作
  38.                 CustomChildThread customThread = new CustomChildThread();
  39.                 customThread.start();
  40.             }
  41.         });
  42.     }

  43.     /**
  44.      * 子线程,用于处理耗时工作
  45.      */
  46.     public class CustomChildThread extends Thread {

  47.         @Override
  48.         public void run() {
  49.             //发送第一条消息,代表开始执行异步任务
  50.             mHandler.obtainMessage(1).sendToTarget();

  51.             //模拟耗时进度,将进度值传给主线程用于更新 ProgressBar 进度。
  52.             for (int i = 1; i <= 5; i++) {
  53.                 try {
  54.                     //让当前执行的线程(即 CustomChildThread)睡眠 1s
  55.                     Thread.sleep(1000);

  56.                     //将执行进度参数 i 传递给主线程 progressBar
  57.                     mHandler.obtainMessage(2, i).sendToTarget();
  58.                 } catch (InterruptedException e) {
  59.                     e.printStackTrace();
  60.                 }
  61.             }


  62.         }
  63.     }

  64. }
复制代码
3.2 Kotlin版本的具体代码如下:
  1. class TestHandlerObtainMessageActivity : AppCompatActivity() {
  2.     companion object {
  3.         const val PROGRESS_VALUE_KEY = "PROGRESS_VALUE"
  4.     }

  5.     override fun onCreate(savedInstanceState: Bundle?) {
  6.         super.onCreate(savedInstanceState)
  7.         setContentView(R.layout.activity_thread_add_handler)

  8.         handlerAddThreadStartBtn.setOnClickListener(View.OnClickListener {
  9.             //工作线程开始模拟下载任务
  10.             val workThread: WorkThread = WorkThread(this)
  11.             workThread.start()
  12.         })
  13.     }

  14.     class WorkThread(activity: TestHandlerObtainMessageActivity) : Thread() {
  15.         private var handler: MyHandler = MyHandler(activity)

  16.         override fun run() {
  17.             super.run()
  18.             for (i in 0..6) {
  19.                 sleep(1000)
  20.                 //通过 Handler 将进度参数传递给 主线程,让其更新 progressBar 进度
  21.                 val bundle = Bundle()
  22.                 bundle.putInt(PROGRESS_VALUE_KEY, i)
  23.                 handler.obtainMessage(1, bundle).sendToTarget()
  24.             }
  25.         }
  26.     }

  27.     /**
  28.      * 静态内部类,防止内存泄漏
  29.      */
  30.     class MyHandler(activity: TestHandlerObtainMessageActivity) : Handler() {
  31.         private var weakReference = WeakReference(activity)

  32.         override fun handleMessage(msg: Message) {
  33.             super.handleMessage(msg)
  34.             when (msg.what) {
  35.                 1 -> {
  36.                     val activity = weakReference.get()
  37.                     if (activity != null && !activity.isFinishing) {
  38.                         //获取任务执行进度参数,然后通过 ProgressBar 显示出来
  39.                         val bundle: Bundle = msg.obj as Bundle
  40.                         val progressValue: Int = bundle.get(PROGRESS_VALUE_KEY) as Int
  41.                         activity.handlerAddThreadProgressBar.progress = progressValue
  42.                     }
  43.                 }
  44.             }
  45.         }
  46.     }
  47. }
复制代码
4. 总结:

在实际开发中,三种方法的使用都可行,具体用哪种方法,需结合你的实际情况及个人喜好。另外,在实际使用中往往将 Handler 写成静态内部类,这时需要注意防止内存泄露!(The handler class should be static or leaks might occur),具体代码见上方!

4.1 在子线程中创建Handler

思考: 在上面代码中, 我们都是在主线程中创建了 Handler 对象,那如果在子线程中创建一个 Handler 对象呢?会发生什么呢?
如下所示:我们在 CustomChildThread 线程中,新建一个 Handler 对象。
  1. public class CustomChildThread extends Thread {
  2.     @Override
  3.     public void run() {
  4.         Handler handler = new Handler(Activity.this);
  5.         //会报错:java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
  6.     }
  7. }
复制代码
结果: 抛出异常: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()。
原因: 因为在创建 Handler对象时要关联所处线程的 Looper对象,而我们的子线程没有 Looper,所以会抛出上述异常。
解决方法: 通过调用,Looper.prepare() 方法为子线程创建一个 Looper 对象,并且调用 Looper.loop() 方法开始消息循环。如下所示:
  1. class CustomChildThread extends Thread {
  2.     @Override
  3.     public void run() {
  4.         //为当前线程创建一个 Looper 对象
  5.         Looper.prepare();
  6.         
  7.         //在子线程中创建一个 Handler 对象
  8.         Handler handler = new Handler() {
  9.             public void handleMessage(Message msg) {
  10.                 // 在这里处理传入的消息
  11.             }
  12.         };
  13.         //开始消息循环
  14.         Looper.loop();
  15.     }
  16. }
复制代码
以上就是详解Android的Handler机制原理的详细内容,更多关于Android Handler机制的资料请关注晓枫资讯其它相关文章!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
11
积分
2
注册时间
2023-9-27
最后登录
2023-9-27

发表于 2025-3-16 04:47:50 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

  • 打卡等级:无名新人
  • 打卡总天数:1
  • 打卡月天数:0
  • 打卡总奖励:9
  • 最近打卡:2024-09-20 02:42:16
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
24
积分
10
注册时间
2023-12-14
最后登录
2024-9-20

发表于 2025-4-3 20:11:16 | 显示全部楼层
感谢楼主,顶。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
18
积分
16
注册时间
2022-12-29
最后登录
2022-12-29

发表于 3 天前 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼
4楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

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