Android_Handler

安卓中的消息循环机制Handler及Looper详解 我们知道安卓中的UI线程不是线程安全的,我们不能在UI线程中进行耗时操作,通常我们的做法是开启一个子线程在子线程中处理耗时操作,但是安卓规定不允许在子线程中进行UI的更新操作,通常我们会通过Handler机制来完成该功能,即当子线程中耗时操作完成后,在子线程中通过Handler向主线程发送消息,在主线程中的Handler的handleMessage方法中处理接受到的消息。这就是安卓中的消息机制,安 阅读详情

一.Handler的简介
        首先来了解一下Handler:
        Handler为Android操作系统中的线程通讯工具,来自包:android.os.Handler
        Handler绑定了两个队列:
        1.消息队列:发送--接受--处理消息(消息队列使用sendMessage和HandleMessage的组合来发送和处理消息。)
        2.线程队列:启动--结束--休眠线程(线程队列类似一段代码,或者说一个方法的委托,用户传递方法。使用post,postDelayed添加委托,使用 removeCallbacks移除委托。)
        在进一步了解Handler之前,先说一下为什么需要Handler这个类:
        当一个应用程序启动的时候,Android首先会开启一个主线程(UI线程),主线程管理界面中的UI控件,进行事件分发!比如说:当你点击一个按钮的时候,Android系统会分发事件到Button上,来响应你的操作。如果此时需要一个耗时的操作,例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象,如果5秒钟还没有完成的话,会收到Android系统的一个错误提示“强制关闭”。这个时候我们需要把这些耗时的操作,放在一个子线程中!然而这涉及到子线程更新UI。在java里,可以直接在子线程中刷新UI界面,可是在android编程中,是不可以的!因为他违背了单线程模型:Android中,UI操作必须在主线程(UI线程)中进行的,这个跟Android的线程安全有关!那么更新UI只能在主线程中更新,子线程中操作是危险的,因此想更新UI,可以通过子线程发送信息给主线程,让主线程来更新UI,所以就引入了Handler!
        那么Handler是用来干嘛的?通俗一点来说:Handler就是在各个进程间发送数据的处理对象!在任何的线程中,只要获得了另一个线程的Handler,就可以向那个线程发送数据!基于这个机制,我们可以在UI线程中建一个Handler,然后新建一个子线程进行一些费时的操作,操作完成后,可以调用主线程中的handler,来发送信息告诉主线程,UI线程(主线程)进行更新UI界面!

二.Handler常用的API

方法签名

描    述

public void handleMessage (Message msg)

子类对象通过该方法接收信息

public final boolean sendEmptyMessage (int what)

发送一个只含有what值的消息

public final boolean sendMessage (Message msg)

发送消息到Handler,

通过handleMessage方法接收

public final boolean hasMessages (int what)

监测消息队列中是否还

有what值的消息

public final boolean post (Runnable r)

将一个线程添加到消息队列

Handler Handler处理者 
        是Message的主要处理者,负责Message的发送,Message内容的执行处理。后台线程就是通过传进来的Handler对象引用来sendMessage(Message)。而使用Handler,需要implement 该类的 handleMessage(Message) 方法,它是处理这些Message的操作内容,例如更新UI。 通常需要子类化Handler来实现handleMessage方法。
Message QueueMessage Queue消息队列 
        用来存放通过Handler发布的消息,按照先进先出执行。 每个message queue都会有一个对应的Handler。Handler会向message queue通过两种方法发送消息:sendMessage或post。这两种消息都会插在message queue队尾并按先进先出执行。但通过这两种方法发送的消息执行的方式略有不同:通过sendMessage发送的是一个message对象,会被Handler的handleMessage()函数处理;而通过post方法发送的是一个runnable对象,则会自己执行。 
Looper Looper是每条线程里的Message Queue的管家。 
        Android没有Global的Message Queue,而Android会自动替主线程(UI线程)建立Message Queue,但在子线程里并没有建立Message Queue。所以调用Looper.getMainLooper()得到的主线程的Looper不为NULL,但调用Looper.myLooper()得到当前线程的Looper就有可能为NULL。Looper消息队列(MessageQueue)的管家,在消息队列中,只能有一个管家,管理着整个消息队列,而消息队列可以有多个消息(Message),Hadnler(工人)也可以有多个,管家负责派遣他们向消息队列中存储或取出消息后执行任务!
三.Handler的使用
(1) Handler的消息处理机制
界面效果图:



代码:

package com.liangdianshui.handlermessage;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

	private int number = 1;
	private static final int CHANGE_TITLE = 0;
	public static final String TAG = "MainActivity";
	private TextView mTvTitle;
	private Button mChange;
	private MyThread myThread;

	Handler handler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case CHANGE_TITLE:
				Log.d(TAG, "Handler中线程的id= " + Thread.currentThread().getId()
						+ "/n");
				mTvTitle.setText("Title " + number);
				break;

			default:
				break;
			}
		}
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Log.d(TAG, "MainActivity中线程的id= " + Thread.currentThread().getId()
				+ "/n");
		init();
	}

	private void init() {
		mTvTitle = (TextView) findViewById(R.id.tv_title);
		mChange = (Button) findViewById(R.id.bt_change);
		mChange.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				myThread = new MyThread();
				myThread.start();
				try {
					myThread.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				myThread.destroy();
				number++;
			}
		});
	}

	class MyThread extends Thread {

		private boolean finished = false;

		@Override
		public void run() {
			while (!finished) {

				Message message = new Message();
				message.what = CHANGE_TITLE;
				message.obj = "Title " + number;
				handler.sendMessage(message);
				Log.i(TAG, "MyThread中线程的id= " + Thread.currentThread().getId()
						+ "/n");
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}

		@Override
		public void destroy() {
			finished = true;
		}
	}

}
         Handler消息处理机制Demo:http://download.youkuaiyun.com/detail/two_water/9332033
        从Log可以看出消息处理是在主线程中处理的,在消息处理函数中可以安全的调用主线程中的任何资源,包括刷新界面。工作线程和主线程运行在不同的线程中,所以必须要注意这两个线程间的竞争关系。
总结:
1、如果通过工作线程(子线程)刷新界面,可以使用Handler对象来实现。
2、注意工作线程和主线程之间的竞争关系。推荐handler对象在主线程中构造完成(并且启动工作线程之后不要再修改之,否则会出现数据不一致),然后在工作线程中可以放心的调用发送消息SendMessage等接口。
3、handler对象的handleMessage接口将会在主线程中调用。在这个函数可以放心的调用主线程中任何变量和函数,进而完成更新UI的任务。
(2)子线程创建消息队列更新UI
效果图:
Button被按下时,从主线程向子线程发送一个数字,然后子线程将数字用Toast显示,而主线程将TextView也被设置成该数字。



代码:

package com.liangdianshui.handlermessage3;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

	private int number = 1;
	public static final String TAG = "MainActivity";
	private TextView mTvTitle;
	private Button mChange;
	private LooperThread looperThread;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Log.d(TAG, "MainActivity中线程的id= " + Thread.currentThread().getId()
				+ "/n");
		looperThread = new LooperThread();
		looperThread.start();
		init();
	}

	private void init() {
		mTvTitle = (TextView) findViewById(R.id.tv_title);
		mChange = (Button) findViewById(R.id.bt_change);
		mChange.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				Message message = Message.obtain();
				message.arg1 = number;
				mTvTitle.setText("主线程发送了 :" + String.valueOf(message.arg1));
				looperThread.handler.sendMessage(message);
				number++;

			}
		});
	}

	class LooperThread extends Thread {

		public Handler handler;

		@Override
		public void run() {

			Looper.prepare();

			handler = new Handler() {
				public void handleMessage(Message msg) {
					Log.d(TAG, "LooperThread中线程的id= "
							+ Thread.currentThread().getId() + "/n");
					Toast.makeText(MainActivity.this,
							"LooperThread handler 收到消息 :" + msg.arg1,
							Toast.LENGTH_LONG).show();
				};
			};
			Looper.loop();// loop()会调用到handler的handleMessage(Message
							// msg)方法,所以,写在下面;
		}
	}

}

子线程创建消息队列更新UI:http://download.youkuaiyun.com/detail/two_water/9332045

(3)Handler的线程队列

效果图:


代码:

package com.liangdianshui.handlerthreadqueue;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {

	private Button mBtDownload;
	private ProgressDialog mProDialog;

	Handler mHandler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			mProDialog.setProgress(msg.arg1);
			mHandler.post(mThread);
		};
	};

	Runnable mThread = new Runnable() {
		int i = 0;

		@Override
		public void run() {
			i += 1;
			Message message = mHandler.obtainMessage();
			message.arg1 = i;
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			mHandler.sendMessage(message);
			if (message.arg1 == 100) {
				mHandler.removeCallbacks(mThread);
				mProDialog.setMessage("Finished");
				mProDialog.dismiss();
			}
		}
	};

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

		mBtDownload = (Button) findViewById(R.id.bt_download);

		mProDialog = new ProgressDialog(MainActivity.this);
		mProDialog.setTitle("Download");
		mProDialog.setMessage("Downloading.....");
		mProDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
		mProDialog.setIndeterminate(false);
		mProDialog.setCancelable(true);

		mBtDownload.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				mProDialog.show();
				mHandler.post(mThread);
			}
		});

	}

}
Handler的线程队列Demo:http://download.youkuaiyun.com/detail/two_water/9332007





Python3.11安装fairseq避坑指南:解决dataclasses兼容性问题(附详细代码修改) 本文详细解析了在Python 3.11环境下安装Fairseq时因dataclasses模块规则变更导致的安装失败问题。通过定位核心配置文件,将`default=SomeConfig()`修改为`default_factory=SomeConfig`,并调整依赖版本,提供了从源码修改到环境验证的完整解决方案,确保Fairseq顺利运行。 阅读详情

相关推荐

解决RK3566 USB OTG模式识别问题:从原理图分析到otg_mode文件操作全解析

本文深入解析RK3566 USB OTG模式识别问题,从硬件原理图设计到Linux内核的otg_mode文件操作,提供全面的调试方案。针对USB_OTG0_ID引脚电路设计、电源管理关联及内核驱动交互等关键点,给出实战调试技巧和常见问题解决方案,帮助开发者高效解决USB OTG模式切换难题。

eee77的博客 866

Android :安卓学习笔记之 Handler机制 的简单理解和使用

Android Handler机制的简单理解和使用1、Handler使用引出2、背景和定义3、作用4、相关概念5、工作流程5.1、对应关系6、基本使用7、参考 1、Handler使用引出 现在作为客户,有这样一个需求,当打开Activity界面时,开始倒计时,倒计时结束后跳转新的界面(思维活跃的朋友可能立马想到如果打开后自动倒计时,就类似于各个APP的欢迎闪屏页面),如下图: 可能觉得直接开启一个包含倒序循环的子线程就ok了,具体实现如下: activity_main <?xml version="

JMW1407的博客 6776

【QGIS】【OsGeo4w】安装方法

every blog every motto: You will never know unless you try 0. 前言 因为目前要使用QGIS,然而环境配置就整了大半天,哎,进行简单记录,方便自己方便他人。 一共分为两种方式安装: 独立安装包 网络安装包(下载osgeo4w-setup) QGIS提供了不同的版本: 长期发行版(LTR) 最新版(LR) 开发人员版本(DEV,母版或测试版) 说明: 本文推荐第二种 1. 正文 1.1 下载osgeo4w 下载链接 下载完成: 1.2

胡侃有料的博客 2万+

android.os.handler包,【Android】Handler详解

* Handler的定义:* 主要接受子线程发送的数据, 并用此数据配合主线程更新UI。当应用程序启动时,* Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发,比如说,* 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作。* 如果此时需要一个耗时的操作,例如:联网读取数据,或者读取本地较大的一个文件的时候...

weixin_29122445的博客 1141

【实战解析】Ubuntu双网卡冲突:如何解决同一网段下网关无法访问及上网问题

本文深入解析Ubuntu服务器双网卡配置在同一网段时引发的路由冲突问题,导致网关无法ping通及无法上网。通过分析路由表与Metric值原理,提供使用route命令调整优先级及修改Netplan配置文件的实战解决方案,确保主次路由明确,一劳永逸解决网络冲突。

f9g0h的博客 280

2022北京高考数学压轴题21题:Python暴力枚举验证k≥7的5种反例

本文探讨了2022北京高考数学压轴题21题的编程解法,通过Python暴力枚举验证k≥7的5种反例。文章详细介绍了m-连续可表数列的定义、问题转化与约束条件,并提供了暴力枚举算法设计和优化技巧,帮助读者理解如何用编程思维解决数学问题。

weixin_33552698的博客 233

安卓的Handler机制

Android Handler机制解析 Handler机制是Android实现线程间通信的核心框架,主要由四个关键组件构成: Handler:消息发送和处理的桥梁,负责发送消息(sendMessage)和处理消息(handleMessage) Message:消息数据结构,包含what、obj、arg1/arg2等字段 MessageQueue:消息队列,负责消息的存储和管理 Looper:消息循环,从队列中取出消息并分发 每个线程只能拥有一个Looper,通过ThreadLocal保证线程隔离。使用Han

weixin_44078411的博客 1170

湿式双离合器自动变速器simulink建模与仿真

随着汽车工业的不断发展,自动变速器在提高汽车性能、驾驶舒适性和燃油经济性等方面发挥着越来越重要的作用。湿式双离合器自动变速器(Wet Dual-Clutch Transmission,简称 WDCT)作为一种先进的自动变速器技术,具有换挡速度快、动力传递平稳、燃油经济性好等优点,被广泛应用于各类汽车中。结构组成湿式双离合器自动变速器主要由双离合器、齿轮传动系统、液压控制系统和电子控制系统等部分组成。双离合器:由两个独立的离合器组成,分别控制奇数挡和偶数挡。通过切换两个离合器的工作状态,可以实现快速换挡。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 348

Android基础之Handler分析,vivo安卓开发面试

这个锁,说明的是对所有调用同一个MessageQueue对象的线程来说,他们都是互斥的,然而在我们的Handler里 面,一个线程是对应着一个唯一的Looper对象,而Looper中又只有一个唯一的MessageQueue(这个在上文中也有介绍)。Handler是用于线程间通信的,但是它产生的根本并不只是用于UI处理,而更多的是handler是整个app通信的框架, 大家可以在ActivityThread里面感受到,整个App都是用它来进行线程间的协调。如果频繁的生成对象就会产生内存抖动,也会引发OOM。

m0_57502067的博客 1006

CARLA仿真:自定义地图与AI车辆行为编程

CARLA仿真:自定义地图与AI车辆行为编程 ,人工智能,计算机视觉,大模型,AI,本文围绕CARLA仿真平台,介绍了其基础功能与安装方法,详解地图系统,包括预设地图的加载切换及自定义地图的创建、导入与优化。还阐述了AI车辆的创建、属性设置、销毁,以及行为控制,如交通规则遵守、路径规划、复杂行为编程和行为树应用。同时涉及传感器与车辆感知、交通场景构建、自定义地图与AI行为结合应用、高级应用,以及常见问题解决方案和学习资源,为CARLA仿真应用提供全面指导。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 11万+

OWASP 2025版AI大模型攻击安全风险汇总(攻击方法种类)

提示词注入是大模型最基础、最常见的核心漏洞,攻击者通过构造直接或间接的恶意自然语言输入,篡改大模型原本的正常行为与输出结果。哪怕这类恶意内容对人类是隐藏、不可见的,只要模型能够正常解析读取,就会触发漏洞。它和大家常说的模型“越狱”相关,但并不等同:越狱是提示词注入的极端形式,会直接让模型彻底无视所有内置安全协议,完全脱离管控;而普通提示词注入,更多是针对性篡改模型行为、诱导执行特定操作。

墨痕诉清风的博客 517

安卓Handler

1.什么是Handler? Handler是安卓SDK中处理异步消息的核心类。 Handler的作用是让子线程通过与主线程通信来更新UI界面。 2.Handler的运行机制 创建一个Handler对象,系统就把Handler对象、UI线程和UI线程的消息队列捆绑起来。 当我们在线程处理完数据后,可以通过Handler对象将消息发出。 消息将会会按顺序添加到消息队列中。 UI线程中的L...

qq_41451851的博客 1217

【DeepSeek实战】1、DeepSeek民用级开发全指南:从0到1掌握AI应用开发与模型蒸馏实战

DeepSeek创新性地打破了传统AI开发的技术壁垒,通过双模型架构(DeepSeek-V3和R1)实现普惠化与专业化并重。其核心优势包括:零代码操作、浏览器直接使用、中文提示词控制及低成本(2元/百万token)。用户通过简单三步(注册-配置-使用)即可快速开启AI之旅,平台提供$50免费额度支持2个月高频使用。 四大核心应用场景: 办公自动化:周报撰写、PPT生成、数据分析一键完成 内容创作:提供爆款标题生成、垂直领域写作模板 学习辅助:支持文档解析、错题讲解、知识图谱构建 生活服务:个性化行程规划

2025博客之星Top81。专注AI工程化与架构实战。从分布式思维到模型部署,用工程化视角为你厘清AI落地的真实路径。 1735

安卓中的Handler是怎样的

Handler: 是实现android中不同线程间通信的一种机制,它允许主线程UI线程通过发送message和runable对象到handler,在其handler关联线程中处理这些消息和runnable、 其常用于执行异步任务处理,网络请求/文件读写等,将耗时操作放在单独线程中执行并通过handler进行返回UI主线程,可以避免阻塞UI主线程,提高响应速度。。<<<<////>>>>>Handler: 处理消息的对象,它负责发送和处理消息、sendMessage()/post()

lui0617的博客 861

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

无法导入android.os.Handler

无法导入android.os.Handler

qq_25592833的博客 1756

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

安卓handler机制

Handler Android中 ui的更新需要在主线程中进行,一些耗时的操作我们会放在后台线程中进行,而将执行结果在ui线程中进行。 安卓在设计时就封装了一套消息创建,传递,处理机制,如果不遵循这样的机制,就无法更新ui信息,并抛出异常: 不能在非UI线程中去更新UI。 因此就引入了hanlder机制 特点 a. 允许你去发送并处理一条runnable对象和messageQueue相关联的信息。 b. 每一个handler的实例都与一个单独的线程 c. 当创建一个新的处理程序时,它将绑定到正在创建线程的线

weixin_47285644的博客 1109

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

android.os.handler包,Android Handler机制(不含源码解析,适合新手理解)

一、官方解释A Handler allows you to send and process [Message](https://developer.android.com/reference/android/os/Message.html) and Runnable objects associated with a thread's [MessageQueue](https://develop...

weixin_35815766的博客 1244

【Android】Handler,安卓内存优化管理器

============================================================================= 1. Looper和消息队列机制 Handler持有了一个消息队列MessageQueue对象mQueue。这个对象是Handler实例构造的时候,通过Looper传递过来的。当使用无参构造方法时,这个Looper为Looper.myLooper()。 public Handler() { // 。。。 mLooper = Looper.myLoope

wq221aas的博客 528

Android中Handler简介

1.本文的阅读对象 本文的阅读对象是掌握了一些安卓基础知识的朋友,本文不会涉及源码,也不会有过多代码,对新手比较友好,用简单容易理解的语言描述Handler在安卓开发中的作用 2.Handler是什么? 我们先从字面分析,Handler由英文直译,可以翻译为处理者。在Android中,Handler机制主要用作异步消息处理,这是谷歌设计的一套机制,能帮助我们有序的处理异步操作。 3.And

周敬斌的博客 1240

安卓Handler机制

Handler机制运用在安卓线程之间的消息传递。Handler之所以能够运行,得力于与Handler紧密相联的Looper,每一个线程都只能有一个Looper,一个Looper就可以看成一个事件执行者,Handler决定对事件做什么具体操作,所以一般继承了Handler就要重写其中的handleMessage方法,那么事件从哪里来呢?从消息队列MessageQueue中得来。 Handler的使用...

whoami_I的博客 1550

android handler面试,安卓Handler机制学习笔记附面试问题

基础知识Handler 机制相关的概念包括 Handler、Message 、Message Queue、Looper具体如下图相关的概念核心方法接下来我们将四个相关的类一个个按着源码来看一遍MessageMessage是信息传递的载体里面没有太多逻辑就是包括一些信息传递机制里面必须要用到的属性主要看其构造函数的源码public static Message obtain() {synchroni...

weixin_34835470的博客 166

android.os.handler包,android.os.Handler

android.os.handlerA Handler allows you to send and process Message and Runnable objects associated with a thread's MessageQueue. Each Handler instance is associated with a single thread and that threa...

weixin_31689651的博客 207

安卓Handler的学习笔记哦

本文主要是对安卓handler的相关知识做一个小小的总结!

HumanAwake的博客 1192

关于android studio下的handler问题

如图,用android studio ,显示的handler中的handleMessage和senMessage都是红色,提示的信息貌似是,需要重写的不应该是handleMessage,而是这三个方法: 谁知道这是怎么回事吗?我也是看的别人的代码对着敲的,并且我在API上也看到有handleMessage方法啊?     解答: 你的包倒错了,导入的包应该为androd.os.Han

sangleisunny的专栏 1810

安卓入门七十一 Handler

本篇文章介绍 Android Handler 的基本使用方法,且 Demo 会以 Java & Kotlin 两种代码形式进行展示。在 Android 实际开发中,我们经常会遇到耗时任务,比如:网络请求API接口来获取数据、数据库 CRUD 操作等等,我们需要额外创建开启工作线程来处理这些耗时任务。由于 Android 规定只能由主线程才能处理 UI 工作,所以这时候我们就需要通过 Handler 来通知主线程处理 UI 工作。Handler:子线程与主线程之间的沟通中介,用于传递处理消息。

weixin_52735932的博客 963
上一篇: Android_Fragment
下一篇: Android_JSON数据解析
Two_Water
博客等级 码龄12年 573粉丝 134原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值