- Android 使用PopupWindow
徐子元竟然被占了!!
Androidandroid
Android使用PopupWindowmainactivity.Javaimportandroid.content.Context;importandroid.content.Intent;importandroid.graphics.drawable.ColorDrawable;importandroid.os.Bundle;importandroid.view.LayoutInflater;
- Android PopupWindow 和 Dialog Activity的使用
lq_ios
PopupWindow(悬浮框)Android中的PopupWindow类似iOS中的UIPopoverPresentationController弹窗,可以显示在某个view的附近,相对于AlertDialog,AlertDialog在位置显示上是固定的(默认是居中,当然也可以通过dialog.window?.attributes中的x,y改变位置),而PopupWindow则相对比较随意,可以
- Activity android:configChanges属性
persist89
xml
报错android.view.windowleaked——窗口泄漏。Android的每个Activity都有个WindowManager窗口管理器,构建在某个Activity之上的对话框、PopupWindow也有对应的WindowManager窗口管理器。由于Dialog、PopupWindown不能脱离Activity而单独存在着,所以当承载某个Dialog或者某个PopupWindow正在显
- android:configChanges属性
小南胡
安卓原生
今天有幸去哥们的大公司做了半天的暂时工,一个偶现的Bug折腾了他好久,好不easy今天抓到了异常Log日志。大致的意思就是android.view.windowleaked——窗口泄漏。我在网上查了资料:Android的每个Activity都有个WindowManager窗口管理器,构建在某个Activity之上的对话框、PopupWindow也有对应的WindowManager窗口管理器。由于D
- View的绘制流程
追寻米K
先说一下Window,window分三种:应用Window、子Window、系统Window。应用Window就是我们的activity对应的窗口。子window比如dialog、PopupWindow等,子Window不能单独存在,需要依附在特定的父Window中。系统Window比如Toast和系统状态栏,系统Window是需要声明权限才能创建的Window。window层级这些层级范围对应着
- popupwindow 实现搜索历史列表
吃啥呀
kotlin配合searchviewlistpopupwindow开始的代码classSearchActivity:AppCompatActivity(),SearchContract.SearchUIView{privatelateinitvarsearchView:SearchViewprivatelateinitvarhistoryRecord:MutableListprivatelatei
- PopupWindow使用showAsDropDown低版本不显示问题。
犇犇灬zk
问题记录:自定义PopupWindow继承PopupWindow,使用showAsDropDown方法弹出时,在Android高版本中可以正常使用,在使用低版本(Android5.1.1)发现弹出后width和height都是0。xml文件中根布局使用的layout_width和layout_height值为wrap_content。问题原因:xml根布局设置的wrap_content的并不会作用
- Android 7.0 popupWindow update()的坑
顺应自然y
在Android7.0手机上发现popupWindow位置不对,后来经过排查,发现Android7.0源码上update()有bug,会把位置固定成顶部。解决方案:在Android7.0手机上不使用update()方法。if(Build.VERSION.SDK_INT!=Build.VERSION_CODES.N){//Android7.0手机调用PopupWindowupdate会导致位置错乱p
- PopupWindow 学习笔记
feifei_fly
今天学习了PopupWindow,正好做个笔记记录一下,以便查阅。一、Android中的弹框分为两种AlertDialog和PopupWindow1、AlertDialog弹框位置是固定的,并且是非阻塞性的。弹窗显示时,当前线程不会阻塞。2、PopupWindow弹框的位置可是任意指定,并且会阻塞线程二PopupWindow使用PopupWindow分为两个步骤:1.初始化PopupWindowp
- Android自定义Dialog对话框的三种方法
AndyYuan317
布局的中等知识点Dialog
自定义对话框是经常使用的功能,我们常用的弹窗操作,除了使用popwindow(popupwindow的简单实用)就是使用dialog来实现,这两种组件都支持之定义布局和功能来满足我们个性化的需求,也可以不采用自定义而直接使用系统封装好的api来实现功能。今天简单总结下在使用dialog做弹窗功能的方法和会遇到的问题与解决方案方法一:直接使用系统的,不自定义布局和功能方式,效果如下图:点击事件中代码
- 记一个ViewPager-with-Fragments-inside-PopupWindow-的坑
ConquerRen
android开发viewpagerfragmentpopupwindow
记一个ViewPager-with-Fragments-inside-PopupWindow-的坑。当时实现的一个场景是:在popupwindow中需要实现一个可以左右滑动很多页的viewpagerViewPagerwithFragmentsinsidePopupWindow(orDialogFragment)会出现一个错误:Errornoviewfoundforidforfragment我跟到最
- js 创建弹出窗口
言小溪
JavaScript【基础】javascript前端html
/***创建弹出窗口*@paramurl地址*@paramwinName窗口名*@paramwidth宽*@paramheight高*@paramscrollbars是否有滚动条*@paramresizable是否可调整大小*/exportfunctioncreatePopupWindow(url:string,name:string,opts:{width:number;height:numbe
- .9图片有坑
new_xd
结论:如果view是代码生成的,设置.9图片作为背景,用于PopupWindow,会使view的padding属性不生效在xml中写view,直接展示在xml中写view,inflate出来,用于PopupWindow这两种情况,都没有问题代码中new出来的view,用于PopupWindow,就会有问题。背景换为颜色,以上三种情况都不会有问题
- android对话框activity,Android使用Activity用作弹出式对话框
果芽MBA刘令涛
转载请表明出处:http://blog.csdn.net/lmj623565791/article/details/23116115Android中可用于实现对话框的有Dialog,PopupWindow,Activity。下面简单介绍下,Dialog比较方便,但是显示位置比较固定,有时不能满足我们的需求。例子:(消除了背景)@nulltruefalsetrue@android:color/bla
- 搜索筛选框的封装
Infinity_空
背景:因为我们的应用中有很多业务查询的功能,包括但不限于融资申请列表,放款列表申请,银行账户审核等等10来个列表,而针对每一个列表,都有各自一套搜索条件,而且这些搜索条件又各不相同。一开始的时候,是直接用XML+PopupWindow开发的,但是随着列表越做越多,XML越写越多,逐渐就看着很冗余,很不爽。而且需要重复写很多样板代码进行点击事件的监听和文本内容的获取。实现过程:后面我在研究一个Tab
- Android开发之PopupWindow
Afison
Androidandroid动画
PopupWindow与AlertDialog在Android开发中,PopupWindow与AlertDialog是我们在实际开发中可能用到的,其功能相当于弹窗实现相应的需求。AlertDialog不能指定显示位置,只能默认显示在屏幕最中间(当然也可以通过设置WindowManager参数来改变位置)。而PopupWindow是可以指定显示位置的,随便哪个位置都可以,更加的灵活。PopupWin
- Android studio 之 弹窗PopupWindow
YUFENGSHI.LJ
androidstudioandroidstudiogiteeandroid
1.准备弹窗视图popuop_layout.xml2.添加一个按钮3.在按钮的点击事件中设置弹窗实例化PopupWindow对象参数一,用在弹窗中的View(注意不是布局资源id,所以要根据布局资源id转换成view)布局文件xml和视图之间的关系布局文件(.xml文件)定义了UI元素的结构和外观,而View对象则代表了布局中的一个具体的UI元素。通过使用LayoutInflater类,我们可以将
- 从使用BottomSheetDialogFragment到放弃,改直接使用Popupwindow
汤米粥
笔记动画
我项目中有个需求,是要从下面滑出一个页面,点x往下滑走。这个页面占全屏(显示状态栏)当然,我首先想到的是用BottomSheetDialogFragment,因为我知道这就是用来做底出滑出效果的。可是用起来发现这个BottomSheetDialog用起来有这么多不爽的地方:1.你写的布局不是是全屏的,但他默认只出来一部分。于是用这样的代码解决了vallayoutParams=bottomSheet
- PopupWindow弹窗后无法获取焦点问题
犇犇灬zk
TV端开发时,使用Dialog弹窗,Dialog中有控件设置了可获取焦点(如ButtonsetFocusable:true),当弹窗后控件执行requestFocus,可以获取焦点。但是使用PopupWindow弹窗时,同样的控件设置了可获取焦点如ButtonsetFocusable:true),当弹窗后控件执行requestFocus,控件无法响应遥控器按键,焦点还在原来焦点控件上。解决方法:P
- 2022-06-05 PopupWindow外部不可点击以及外部半透明效果
兣甅
1.外部不可点击,在Activity中重写dispatchTouchEvent,如下@OverridepublicbooleandispatchTouchEvent(MotionEventevent){//hasShow弹窗调用后为true,PopupWindow.setOnDismissListener里面设为falseif(hasShow)returnfalse;returnsuper.dis
- Android之UI--打造12种Dialog对话框
切切歆语
最近有空,来把app中常用到的Dialog对话框写一篇博客,在app中很多地方都会用到Dialog对话框,今天小编我就给大家介绍Dialog对话框。先看看效果图:image12种,可根据需求选择,上图可知,底部弹框也可通过Dialog对话框实现,可以不用PopupWindow来实现了,比较方便AndroidSupportLibraryv22.1中开始提供了Material风格的Dialog控件,看
- PopupWindow showAtLocation详解
折翅的雏鹰
popWinMenu.showAtLocation(main2,Gravity.LEFT|Gravity.TOP,0,0);示例图如下位置开始:屏幕的左上角(坐标(0,0)),但是由于系统原因,popuwindow不能覆盖导航栏此时popuwindow左上角的坐标:(0,导航栏高度),所以计算位置的时候一定要加上导航栏的高度
- android 评论输入框(PopupWindow)
yabinYang
UI
1、先定义一个按钮(activity_main)2、定义一个弹出框布局(popuwindow)3、主要代码(MainActivity)importandroid.app.ActionBar;importandroid.content.Context;importandroid.support.v7.app.AppCompatActivity;importandroid.os.Bundle;impo
- android —— PopupWindow
qq_26554909
android基础android
一、常用方法:1、设置显示的位置//一个参数popupWindow.showAsDropDown(v);//参数1:popupWindow关联的view//参数2和3:相对于关联控件的偏移量popupWindow.showAsDropDown(Viewanchor,intxoff,intyoff)2、是否会获取焦点popupWindow.setFocusable(true);3、设置背景//pop
- 图片放大
高蒙恩_9b74
Viewinflate=getLayoutInflater().inflate(R.layout.big_image_popupwindow,null);ViewPagervp=inflate.findViewById(R.id.img_vp);popupWindow=newPopupWindow(inflate,ViewGroup.LayoutParams.MATCH_PARENT,ViewGr
- Android——消息提示控件
可爱多一点@
Androidandroid移动开发
目录1.Toast(吐司)1.自定义Toast布局2.运用1.布局2.MainActivity.java3.效果展示4.toast.setGravity()不起作用怎么办呢?1.解决方法2.AlertDailog(对话框)1.使用对话框的步骤2.运用1.布局2.AlertDialog_MainActivity.java3.效果展示3.PopupWindow(悬浮框)1.与AlertDialog的区
- Android PopupWindow
zhangphil
AndroidAndroid
代码:packagezhangphil.test;importandroid.content.Context;importandroid.content.res.Resources;importandroid.graphics.Color;importandroid.os.Bundle;importandroid.support.annotation.Nullable;importandroid.
- Android Material Design:ListPopupWindow
zhangphil
AndroidAndroid新概念设计android
AndroidMaterialDesign:ListPopupWindowAndroidMaterialDesign引入的ListPopupWindow,首先是一个PopupWindow,不过此PopupWindow内嵌一个List,给予此List设置一个Adapter,就相当Android为开发者做好了一个内置ListView的PopupWindows。如图所示:给出上述效果的代码实现:pa
- 2020-04-22 关于PopupWindow 数据太多导致showAsDropDown失效
南宫逸诺
重写PopupWindow中的showAsDropDown方法,在方法中加入:if(Build.VERSION.SDK_INT>=24){Rectrect=newRect();anchor.getGlobalVisibleRect(rect);inth=anchor.getResources().getDisplayMetrics().heightPixels-rect.bottom;setHei
- 2018-03-30—PopupWindow和AlertDialog使用
季白zy
PopupWindow和AlertDialog都是实现一个弹出框的功能,但是两个又不太一样,AlertDialog在弹出以后点击弹出框以外的东西无效,而PopupWindow可以。一、PopupWindow使用首先创建工程。配置好各种属性。由于PopupWindow是弹出一个框体,所以我们可以自定义一个布局文件,当然也可以选用android内置的(这里我们选择自己创建)好了,我选择把窗体布局文件设
- tomcat基础与部署发布
暗黑小菠萝
Tomcat java web
从51cto搬家了,以后会更新在这里方便自己查看。
做项目一直用tomcat,都是配置到eclipse中使用,这几天有时间整理一下使用心得,有一些自己配置遇到的细节问题。
Tomcat:一个Servlets和JSP页面的容器,以提供网站服务。
一、Tomcat安装
安装方式:①运行.exe安装包
&n
- 网站架构发展的过程
ayaoxinchao
数据库应用服务器网站架构
1.初始阶段网站架构:应用程序、数据库、文件等资源在同一个服务器上
2.应用服务和数据服务分离:应用服务器、数据库服务器、文件服务器
3.使用缓存改善网站性能:为应用服务器提供本地缓存,但受限于应用服务器的内存容量,可以使用专门的缓存服务器,提供分布式缓存服务器架构
4.使用应用服务器集群改善网站的并发处理能力:使用负载均衡调度服务器,将来自客户端浏览器的访问请求分发到应用服务器集群中的任何
- [信息与安全]数据库的备份问题
comsci
数据库
如果你们建设的信息系统是采用中心-分支的模式,那么这里有一个问题
如果你的数据来自中心数据库,那么中心数据库如果出现故障,你的分支机构的数据如何保证安全呢?
是否应该在这种信息系统结构的基础上进行改造,容许分支机构的信息系统也备份一个中心数据库的文件呢?
&n
- 使用maven tomcat plugin插件debug关联源代码
商人shang
mavendebug查看源码tomcat-plugin
*首先需要配置好'''maven-tomcat7-plugin''',参见[[Maven开发Web项目]]的'''Tomcat'''部分。
*配置好后,在[[Eclipse]]中打开'''Debug Configurations'''界面,在'''Maven Build'''项下新建当前工程的调试。在'''Main'''选项卡中点击'''Browse Workspace...'''选择需要开发的
- 大访问量高并发
oloz
大访问量高并发
大访问量高并发的网站主要压力还是在于数据库的操作上,尽量避免频繁的请求数据库。下面简
要列出几点解决方案:
01、优化你的代码和查询语句,合理使用索引
02、使用缓存技术例如memcache、ecache将不经常变化的数据放入缓存之中
03、采用服务器集群、负载均衡分担大访问量高并发压力
04、数据读写分离
05、合理选用框架,合理架构(推荐分布式架构)。
- cache 服务器
小猪猪08
cache
Cache 即高速缓存.那么cache是怎么样提高系统性能与运行速度呢?是不是在任何情况下用cache都能提高性能?是不是cache用的越多就越好呢?我在近期开发的项目中有所体会,写下来当作总结也希望能跟大家一起探讨探讨,有错误的地方希望大家批评指正。
1.Cache 是怎么样工作的?
Cache 是分配在服务器上
- mysql存储过程
香水浓
mysql
Description:插入大量测试数据
use xmpl;
drop procedure if exists mockup_test_data_sp;
create procedure mockup_test_data_sp(
in number_of_records int
)
begin
declare cnt int;
declare name varch
- CSS的class、id、css文件名的常用命名规则
agevs
JavaScriptUI框架Ajaxcss
CSS的class、id、css文件名的常用命名规则
(一)常用的CSS命名规则
头:header
内容:content/container
尾:footer
导航:nav
侧栏:sidebar
栏目:column
页面外围控制整体布局宽度:wrapper
左右中:left right
- 全局数据源
AILIKES
javatomcatmysqljdbcJNDI
实验目的:为了研究两个项目同时访问一个全局数据源的时候是创建了一个数据源对象,还是创建了两个数据源对象。
1:将diuid和mysql驱动包(druid-1.0.2.jar和mysql-connector-java-5.1.15.jar)copy至%TOMCAT_HOME%/lib下;2:配置数据源,将JNDI在%TOMCAT_HOME%/conf/context.xml中配置好,格式如下:&l
- MYSQL的随机查询的实现方法
baalwolf
mysql
MYSQL的随机抽取实现方法。举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。但是,后来我查了一下MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER BY从句里面不能使用RAND()函数,因为这样会导致数据列被多次扫描。但是在MYSQL 3.23版本中,
- JAVA的getBytes()方法
bijian1013
javaeclipseunixOS
在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组。这个表示在不同OS下,返回的东西不一样!
String.getBytes(String decode)方法会根据指定的decode编码返回某字符串在该编码下的byte数组表示,如:
byte[] b_gbk = "
- AngularJS中操作Cookies
bijian1013
JavaScriptAngularJSCookies
如果你的应用足够大、足够复杂,那么你很快就会遇到这样一咱种情况:你需要在客户端存储一些状态信息,这些状态信息是跨session(会话)的。你可能还记得利用document.cookie接口直接操作纯文本cookie的痛苦经历。
幸运的是,这种方式已经一去不复返了,在所有现代浏览器中几乎
- [Maven学习笔记五]Maven聚合和继承特性
bit1129
maven
Maven聚合
在实际的项目中,一个项目通常会划分为多个模块,为了说明问题,以用户登陆这个小web应用为例。通常一个web应用分为三个模块:
1. 模型和数据持久化层user-core,
2. 业务逻辑层user-service以
3. web展现层user-web,
user-service依赖于user-core
user-web依赖于user-core和use
- 【JVM七】JVM知识点总结
bit1129
jvm
1. JVM运行模式
1.1 JVM运行时分为-server和-client两种模式,在32位机器上只有client模式的JVM。通常,64位的JVM默认都是使用server模式,因为server模式的JVM虽然启动慢点,但是,在运行过程,JVM会尽可能的进行优化
1.2 JVM分为三种字节码解释执行方式:mixed mode, interpret mode以及compiler
- linux下查看nginx、apache、mysql、php的编译参数
ronin47
在linux平台下的应用,最流行的莫过于nginx、apache、mysql、php几个。而这几个常用的应用,在手工编译完以后,在其他一些情况下(如:新增模块),往往想要查看当初都使用了那些参数进行的编译。这时候就可以利用以下方法查看。
1、nginx
[root@361way ~]# /App/nginx/sbin/nginx -V
nginx: nginx version: nginx/
- unity中运用Resources.Load的方法?
brotherlamp
unity视频unity资料unity自学unityunity教程
问:unity中运用Resources.Load的方法?
答:Resources.Load是unity本地动态加载资本所用的方法,也即是你想动态加载的时分才用到它,比方枪弹,特效,某些实时替换的图像什么的,主张此文件夹不要放太多东西,在打包的时分,它会独自把里边的一切东西都会集打包到一同,不论里边有没有你用的东西,所以大多数资本应该是自个建文件放置
1、unity实时替换的物体即是依据环境条件
- 线段树-入门
bylijinnan
java算法线段树
/**
* 线段树入门
* 问题:已知线段[2,5] [4,6] [0,7];求点2,4,7分别出现了多少次
* 以下代码建立的线段树用链表来保存,且树的叶子结点类似[i,i]
*
* 参考链接:http://hi.baidu.com/semluhiigubbqvq/item/be736a33a8864789f4e4ad18
* @author lijinna
- 全选与反选
chicony
全选
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>全选与反选</title>
- vim一些简单记录
chenchao051
vim
mac在/usr/share/vim/vimrc linux在/etc/vimrc
1、问:后退键不能删除数据,不能往后退怎么办?
答:在vimrc中加入set backspace=2
2、问:如何控制tab键的缩进?
答:在vimrc中加入set tabstop=4 (任何
- Sublime Text 快捷键
daizj
快捷键sublime
[size=large][/size]Sublime Text快捷键:Ctrl+Shift+P:打开命令面板Ctrl+P:搜索项目中的文件Ctrl+G:跳转到第几行Ctrl+W:关闭当前打开文件Ctrl+Shift+W:关闭所有打开文件Ctrl+Shift+V:粘贴并格式化Ctrl+D:选择单词,重复可增加选择下一个相同的单词Ctrl+L:选择行,重复可依次增加选择下一行Ctrl+Shift+L:
- php 引用(&)详解
dcj3sjt126com
PHP
在PHP 中引用的意思是:不同的名字访问同一个变量内容. 与C语言中的指针是有差别的.C语言中的指针里面存储的是变量的内容在内存中存放的地址 变量的引用 PHP 的引用允许你用两个变量来指向同一个内容 复制代码代码如下:
<?
$a="ABC";
$b =&$a;
echo
- SVN中trunk,branches,tags用法详解
dcj3sjt126com
SVN
Subversion有一个很标准的目录结构,是这样的。比如项目是proj,svn地址为svn://proj/,那么标准的svn布局是svn://proj/|+-trunk+-branches+-tags这是一个标准的布局,trunk为主开发目录,branches为分支开发目录,tags为tag存档目录(不允许修改)。但是具体这几个目录应该如何使用,svn并没有明确的规范,更多的还是用户自己的习惯。
- 对软件设计的思考
e200702084
设计模式数据结构算法ssh活动
软件设计的宏观与微观
软件开发是一种高智商的开发活动。一个优秀的软件设计人员不仅要从宏观上把握软件之间的开发,也要从微观上把握软件之间的开发。宏观上,可以应用面向对象设计,采用流行的SSH架构,采用web层,业务逻辑层,持久层分层架构。采用设计模式提供系统的健壮性和可维护性。微观上,对于一个类,甚至方法的调用,从计算机的角度模拟程序的运行情况。了解内存分配,参数传
- 同步、异步、阻塞、非阻塞
geeksun
非阻塞
同步、异步、阻塞、非阻塞这几个概念有时有点混淆,在此文试图解释一下。
同步:发出方法调用后,当没有返回结果,当前线程会一直在等待(阻塞)状态。
场景:打电话,营业厅窗口办业务、B/S架构的http请求-响应模式。
异步:方法调用后不立即返回结果,调用结果通过状态、通知或回调通知方法调用者或接收者。异步方法调用后,当前线程不会阻塞,会继续执行其他任务。
实现:
- Reverse SSH Tunnel 反向打洞實錄
hongtoushizi
ssh
實際的操作步驟:
# 首先,在客戶那理的機器下指令連回我們自己的 Server,並設定自己 Server 上的 12345 port 會對應到幾器上的 SSH port
ssh -NfR 12345:localhost:22
[email protected]
# 然後在 myhost 的機器上連自己的 12345 port,就可以連回在客戶那的機器
ssh localhost -p 1
- Hibernate中的缓存
Josh_Persistence
一级缓存Hiberante缓存查询缓存二级缓存
Hibernate中的缓存
一、Hiberante中常见的三大缓存:一级缓存,二级缓存和查询缓存。
Hibernate中提供了两级Cache,第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存。这一级别的缓存是由hibernate管理的,一般情况下无需进行干预;第二级别的缓存是SessionFactory级别的缓存,它是属于进程范围或群集范围的缓存。这一级别的缓存
- 对象关系行为模式之延迟加载
home198979
PHP架构延迟加载
形象化设计模式实战 HELLO!架构
一、概念
Lazy Load:一个对象,它虽然不包含所需要的所有数据,但是知道怎么获取这些数据。
延迟加载貌似很简单,就是在数据需要时再从数据库获取,减少数据库的消耗。但这其中还是有不少技巧的。
二、实现延迟加载
实现Lazy Load主要有四种方法:延迟初始化、虚
- xml 验证
pengfeicao521
xmlxml解析
有些字符,xml不能识别,用jdom或者dom4j解析的时候就报错
public static void testPattern() {
// 含有非法字符的串
String str = "Jamey친ÑԂ
- div设置半透明效果
spjich
css半透明
为div设置如下样式:
div{filter:alpha(Opacity=80);-moz-opacity:0.5;opacity: 0.5;}
说明:
1、filter:对win IE设置半透明滤镜效果,filter:alpha(Opacity=80)代表该对象80%半透明,火狐浏览器不认2、-moz-opaci
- 你真的了解单例模式么?
w574240966
java单例设计模式jvm
单例模式,很多初学者认为单例模式很简单,并且认为自己已经掌握了这种设计模式。但事实上,你真的了解单例模式了么。
一,单例模式的5中写法。(回字的四种写法,哈哈。)
1,懒汉式
(1)线程不安全的懒汉式
public cla