下面是小编为大家收集的Android中Looper的quit方法和quitSafely方法,本文共7篇,仅供参考,欢迎大家阅读,一起分享。

篇1:Android中Looper的quit方法和quitSafely方法
Looper是通过调用loop方法驱动着消息循环的进行: 从MessageQueue中阻塞式地取出一个消息,然后让Handler处理该消息,周而复始,loop方法是个死循环方法,
那如何终止消息循环呢?我们可以调用Looper的quit方法或quitSafely方法,二者稍有不同。
Looper的quit方法源码如下:
public void quit { mQueue.quit(false);}
Looper的quitSafely方法源码如下:
public void quitSafely() { mQueue.quit(true);}
以上两个方法中mQueue是MessageQueue类型的对象,二者都调用了MessageQueue中的quit方法,MessageQueue的quit方法源码如下:
void quit(boolean safe) { if (!mQuitAllowed) {throw new IllegalStateException(Main thread not allowed to quit.); } synchronized (this) {if (mQuitting) { return;}mQuitting = true;if (safe) { removeAllFutureMessagesLocked();} else { removeAllMessagesLocked();}// We can assume mPtr != 0 because mQuitting was previously false.nativeWake(mPtr); }}
通过观察以上源码我们可以发现:
当我们调用Looper的quit方法时,实际上执行了MessageQueue中的removeAllMessagesLocked方法,该方法的作用是把MessageQueue消息池中所有的消息全部清空,无论是延迟消息(延迟消息是指通过sendMessageDelayed或通过postDelayed等方法发送的需要延迟执行的消息)还是非延迟消息,
当我们调用Looper的quitSafely方法时,实际上执行了MessageQueue中的removeAllFutureMessagesLocked方法,通过名字就可以看出,该方法只会清空MessageQueue消息池中所有的延迟消息,并将消息池中所有的非延迟消息派发出去让Handler去处理,quitSafely相比于quit方法安全之处在于清空消息之前会派发所有的非延迟消息。
无论是调用了quit方法还是quitSafely方法只会,Looper就不再接收新的消息。即在调用了Looper的quit或quitSafely方法之后,消息循环就终结了,这时候再通过Handler调用sendMessage或post等方法发送消息时均返回false,表示消息没有成功放入消息队列MessageQueue中,因为消息队列已经退出了。
需要注意的是Looper的quit方法从API Level 1就存在了,但是Looper的quitSafely方法从API Level 18才添加进来。
篇2:Android Canvas的常用方法
我们可以把这个Canvas理解成系统提供给我们的一块内存区域(但实际上它只是一套画图的API,真正的内存是下面的Bitmap),而且它还提供了一整套对这个内存区域进行操作的方法,所有的这些操作都是画图API,也就是说在这种方式下我们已经能一笔一划或者使用Graphic来画我们所需要的东西了,要画什么要显示什么都由我们自己控制。
这种方式根据环境还分为两种:一种就是使用普通View的canvas画图,还有一种就是使用专门的SurfaceView的canvas来画图。两种的主要是区别就是可以在SurfaceView中定义一个专门的线程来完成画图工作,应用程序不需要等待View的刷图,提高性能。前面一种适合处理量比较小,帧率比较小的动画,比如说象棋游戏之类的;而后一种主要用在游戏,高品质动画方面的画图。
Paint 代表了Canvas上的画笔、画刷、颜料等等;
Paint类常用方法:
setARGB(int a, int r, int g, int b) // 设置 Paint对象颜色,参数一为alpha透明值
setAlpha(int a) // 设置alpha不透明度,范围为0~255
setAntiAlias(boolean aa) // 是否抗锯齿
setColor(int color) // 设置颜色,这里Android内部定义的有Color类包含了一些常见颜色定义
setTextScaleX(float scaleX) // 设置文本缩放倍数,1.0f为原始
setTextSize(float textSize) // 设置字体大小
setUnderlineText(booleanunderlineText) // 设置下划线
// 1、将会以颜色ARBG填充整个控件的Canvas背景
//mCanvas.drawARGB(122, 10, 159, 163) ;
// 2、将会以颜色ARBG填充整个控件的Canvas背景
//mCanvas.drawColor(Color.BLUE) ;
// 3、绘制颜色,但是要制定一个mode
//mCanvas.drawColor(Color.BLUE, Mode.SCREEN) ;
// 4、画背景,跟2等效
//mCanvas.drawPaint(mPaint) ;
// 5、画一个点
//mCanvas.drawPoint(23, 23, mPaint) ;
// 6、画很多点这里的float[] 表示{x0,y0,x1,y1,x2,y2,x3,y3.....}
//mCanvas.drawPoints(new float[]{10,11,10,12,10,13,10,14,10,15,10,16}, mPaint) ;
// 7、画线
//mCanvas.drawLine(...) ;
// 8、画长方形 Rect 和RectF的区别?
//精度不一样,Rect是使用int类型作为数值,RectF是使用float类型作为数值
//Rect r = new Rect(10,10,50,50) ;
//mCanvas.drawRect(r, mPaint) ;
//RectF rf = new RectF(10,10,50,50) ;
//mCanvas.drawRect(rf, mPaint) ;
//mCanvas.drawRect(10, 10, 50, 50, mPaint) ;
// 9、画椭圆 初始化RectF的参数是(left,top,right,bottom)
//RectF rf = new RectF(100,100 ,200 ,250) ;
//mCanvas.drawOval(rf, mPaint) ;
// 10、画圆 (圆心x0,圆心y0,半径,paint)
//mCanvas.drawCircle(100, 100, 50, mPaint) ;
// 11、画圆弧 RectF对象表明内切矩形的(left,top,right,bottom)
//RectF rf = new RectF(100 ,100 ,200 ,200) ;
// 参数(rf,startAngle ,angle ,sweepAngle ,paint) sweepAngle表明是否显示圆弧三角形 angle画多少度
//mCanvas.drawArc(rf, 60, 30, true, mPaint) ;
// 12、绘制圆角矩形 RectF是矩形的(left,top,right,bottom)
//RectF rf = new RectF(100 ,100 ,200 ,200) ;
// 50表明x方向的半径,20表示y方向的半径
//mCanvas.drawRoundRect(rf, 50, 20, mPaint) ;
// 13、画任意多边形
//Path path = new Path() ;
//path.moveTo(100, 100) ;
//path.lineTo(200, 200) ;
//path.lineTo(300, 200) ;
//mCanvas.drawPath(path, mPaint) ;
// 14、通过Path对象,也可以画其他的图形
//Path path = new Path() ;
//path.addCircle(100, 100, 20, Path.Direction.CCW) ;
//mCanvas.drawPath(path ,mPaint);
/*drawBitmap
drawText
drawPicture*/
/*Rect r = new Rect(100,100,200,200) ;
ByteArrayOutputStream ut = new ByteArrayOutputStream();
Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bg) ;
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out) ;
InputStream in = new ByteArrayInputStream(out.toByteArray()) ;
*/
/*Picture picture = Picture.createFromStream(mContext.getResources().openRawResource(R.raw.bg)) ;
mCanvas.drawPicture(picture) ;*/
// 15、画bitmap对象
//mCanvas.drawBitmap(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bg),100, 100, mPaint) ;
// 16、Matrix中包含了对Bitmap的处理操作
/*Matrix m = new Matrix() ;
m.postScale(2, 2) ;
m.postRotate(60) ;
mCanvas.drawBitmap(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bg), m, mPaint) ;*/
// 17、画带Matrix参数的bitmap,经过Matrix对象可以对bitmap做相关的处理,比如旋转,缩放,移动等《关于Matrix的使用另行总结》
/*Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bg) ;
Matrix m = new Matrix() ;
m.postScale(2, 2) ;
m.postRotate(60) ;
m.postTranslate(300, 300) ;
mCanvas.drawBitmap(bitmap, m, mPaint) ;*/
//mCanvas.drawBitmap(....) ; 暂不总结
// 18、画文字
//mCanvas.drawText(123, 10, 10, mPaint) ;
//mCanvas.drawText(....) ; 暂不总结
篇3:学习android的方法
学习android的方法
1、Java核心技术:零基础学Android开发,从Java发展史开始,本阶段课程结合开发环境讲解基础语法,熟悉程序结构,再深入细致的介绍Java中面向对象的编程思想,结合常用设计模式、算法,IO流、多线程、集合框架、网络编程、反射内省、泛型、注解、XML、MySQL、Servlet等核心知识,让你全面掌握Java语言的精髓所在,为后续Android开发打下扎实的基础。
2、Android核心技术:从Android入门到精通,本阶段Android培训课程基于Android Studio开发环境,从UI入门,四大组件、系统服务、Fragment、Loaders、SQLite数据库、文件操作、网络通讯、多媒体、动画、布局优化、缓存优化、内存管理、编码技巧等介绍Android应用开发的全过程,最适合初学者的Android基础教程。
3、Android高级专题:本阶段课程基于企业级应用开发中常用或开源的第三方组件、框架,包括:百度地图、Bmob云平台、Git与Linux、NDK、屏幕适配、APP上线、广告植入、传感器、SlidingMenu菜单、PullToRefresh下拉刷新、图片缓存ImageLoader、xUtils框架、第三方登录分享、极光推送、在线支付、蓝牙、语音/人脸识别、二维码、NFC等众多实用技术,这些技术不仅提高你的开发效率和应用的健壮性,也是高薪必备利器。
4、项目实战:Android开发实战经典,本阶段课程以项目为导线,融合以上阶段所学的技术点,训练综合应用开发,讲解项目从需求分析、功能设计、到代码实现,模拟需求变更,还原真实开发中出现难点,解决难点,代码问题解析,调试异常与逻辑错误等问题,让你在真正的项目实战中增长经验。
Android学习必备--java工具15个
1.Weka集成了数据挖掘工作的机器学习算法。这些算法可以直接应用于一个数据集上或者你可以自己编写代码来调用。Weka包括一系列的工具,如数据预处理、分类、回归、聚类、关联规则以及可视化。
2.MassiveOnlineAnalysis(MOA)是一个面向数据流挖掘的流行开源框架,有着非常活跃的成长社区。它包括一系列的机器学习算法(分类、回归、聚类、异常检测、概念漂移检测和推荐系统)和评估工具。关联了WEKA项目,MOA也是用Java编写的,其扩展性更强。
3.MEKA项目提供了一个面向多标签学习和评价方法的开源实现。在多标签分类中,我们要预测每个输入实例的多个输出变量。这与“普通”情况下只涉及一个单一目标变量的情形不同。此外,MEKA基于WEKA的机器学习工具包。
4.AdvancedDataminingAndMachinelearningSystem(ADAMS)是一种新型的柔性工作流引擎,旨在迅速建立并保持真实世界的复杂知识流,它是基于GPLv3发行的。
5.EnvironmentforDevelopingKDD-ApplicationsSupportedbyIndex-Structure(ELKI)是一款基于Java的开源(AGPLv3)数据挖掘软件。ELKI主要集中于算法研究,重点研究聚类分析中的无监督方法和异常检测。
6.Mallet是一个基于Java的面向文本文件的机器学习工具包。Mallet支持分类算法,如最大熵、朴素贝叶斯和决策树分类。
7.Encog是一个先进的机器学习框架,集成了支持向量机(SVM)、人工神经网络、遗传算法、贝叶斯网络、隐马尔可夫模型(HMM)、遗传编程和遗传算法。
8.Datumbox机器学习框架是一个用Java编写的开源框架,允许快速地开发机器学习和统计应用。该框架的核心重点包括大量的机器学习算法以及统计测试,能够处理中等规模的数据集。
9.Deeplearning4j是使用Java和Scala编写的第一个商业级的、开源的、分布式深入学习库。其设计的目的是用于商业环境中,而不是作为一个研究工具。
10.Mahout是一个内置算法的机器学习框架。Mahout-Samsara帮助人们创建他们自己的数学,并提供了一些现成的算法实现。
11.RapidMiner是德国多特蒙特技术大学开发的。它为开发者开发应用程序提供了一个GUI(图形用户界面)和JavaAPI。它还提供了一些机器学习算法,用来做数据处理、可视化以及建模。
12.ApacheSAMOA是一个机器学习(ML)框架,内嵌面向分布式流ML算法的编程抽象,并且允许在没有直接处理底层分布式流处理引擎(DSPEe,如ApacheStorm、ApacheS4和Apachesamza)复杂性的情况下,开发新的ML算法。用户可以开发分布式流ML算法,而且可以在多个DSPEs上执行。
13.Neuroph通过提供支持创建、训练和保存神经网络的Java网络库和GUI工具,简化了神经网络开发。
14.Oryx2是一个建立在ApacheSpark和ApacheKafka的Lambda架构实现,但随着实时大规模机器学习而逐渐开始专业化。这是一个用于构建应用程序的框架,但也包括打包,以及面向协同过滤、分类、回归和聚类的端到端的应用程序。
15.StanfordClassifier是一个机器学习工具,它可以将数据项归置到一个类别。一个概率分类器,比如这个,它可以对一个数据项给出类分配的概率分布。该软件是最大熵分类器的一个Java实现。
篇4:Android 的Canvas中drawArc方法介绍
public void drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)
oval :指定圆弧的外轮廓矩形区域,
startAngle: 圆弧起始角度,单位为度。
sweepAngle: 圆弧扫过的角度,顺时针方向,单位为度,从右中间开始为零度。
useCenter: 如果为True时,在绘制圆弧时将圆心包括在内,通常用来绘制扇形。关键是这个变量,下面将会详细介绍。
paint: 绘制圆弧的画板属性,如颜色,是否填充等。
Paint paint = new Paint;
paint.setStrokeWidth(20);
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.BLUE);
float startAngle01 = 3;
float sweepAngle01 = 86;
RectF rect = new RectF(center - radius, center - radius, center
+ radius, center + radius);
canvas.drawArc(rect, startAngle01, sweepAngle01, true, paint);
当第4个参数为true的绘图如下
当是false的情况时,效果图如下这个参数为true时,会从圆弧的起始点到终点画两条边框
篇5:Android开发工具类(小方法)
1,邮箱地址只展示部分,只展示@前面部分的第1个及最后一个字符,其它的用*代替:
public static String spliteEmail(String email) {/**传入邮箱地址*/ String newEmail = email.split(“@”)[0];/**获取到邮箱@前面部分*/ String[] mails = new String[newEmail.length()]; StringBuffer sb = new StringBuffer(); if (mails.length >0) {if (mails.length < 3) {/**如果邮箱@前面字条小于3个,则显示全部完整邮箱地址*/ return email;}else {/**邮箱地址字符处理*/ for (int i = 0; i < mails.length; i++) {if (i >= 1 && i < mails.length - 1) { sb.append(“*”);}else { sb.append(newEmail.charAt(i));} } return sb.toString() + “@” + email.split(“@”)[1];} } else {return “”; }}
2,手机号码处理(只显示手机号的前3及后3数字,中间用*代替):
public static String splitePhone(String phone) { String[] tel = new String[phone.length()]; StringBuffer sb = new StringBuffer(); if (tel.length >0) { for (int i = 0; i < tel.length; i++) { if (i >2 && i < 7) { sb.append(“*”); } else { sb.append(phone.charAt(i)); } } } return sb.toString(); }另外几个常用的正则表达示:
/**@description:判断是否是身份证格式*/ public static boolean isIDCardNo(String cardNo) { Pattern pattern = Pattern.compile(“(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)”); Matcher matcher = pattern.matcher(cardNo); return matcher.matches(); } /**判断输入的是否是中文*/ public static boolean isChineseChar(String inputString) { Pattern pattern = Pattern.compile(“^[\\u4E00-\\u9FA5\\uF900-\\uFA2D]+$”); // Pattern pattern = Pattern.compile(“^[\\u4E00-\\u9FA5]”); return pattern.matcher(inputString).matches(); } /**匹配非负浮点数*/ public static boolean isNotNegativeFloat(String inputString) { Pattern pattern = Pattern.compile(“^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$”); return pattern.matcher(inputString).matches(); }
篇6:Android fragment onHiddenChanged方法详解
项目中,为了实现不同fragment之间值得传递,首先想到的是利用bundle或者shareprefercnce之类的共享数据机制,当不符合项目需求,有点过于复杂和冗余,就利用网上一位前辈的建议,在主Activity中,创建一个共享的数据变量,在其他fragment中只要获取到这个值就可以得到数据,实现共享,代码如下:
主activity定义一个共享数据变量: private String instrName; public String getInstrName { return instrName; } public void setInstrName(String instrName) { this.instrName = instrName; }
在其他fragment中使用如下语句即可得到该数据:
String instrName = ((MainActivity)getActivity()).getInstrName();
但重点不在于获取数据,我遇到的困难是这样的,先前的博文有提到我使用了popupwindow作为左侧下拉菜单,为了实现主界面不同fragment的切换,做了一个隐藏和显示的处理,只要已经实例化的fragment类,要用的时候,直接show显示即可,不用的时候hide隐藏起来,又不懂或者不知道如何使用的可以参考我这篇博文:点击打开链接。这样实现之后,我要再fragment a中的列表点击其中一个列表项,跳转到另一个fragment b中,当然这个列表项的值需要传递到fragment b中,很多人会认为不是直接可以使用你上面的方法可以得到共享的数据吗?
其实难点在于,第一次切换到fragment b中,已经实例化的时候,确实能得到共享的数据,当第二次切换到fragment b,点击的是其他的列表项,这时候我发现,这个fragment b已经被我隐藏了,并且是这样的:(已经初始化的fragment就不再初始化,只需要hide隐藏),但是隐藏了之后,这段获取数据的代码
String instrName = ((MainActivity)getActivity()).getInstrName();
应该放到哪里会执行呢?
我的要求是从fragment a一切换到fragment b中就要马上获取到共享的数据,并展现在fragment b的列表中?
解决方案其实是有的,以前activity在恢复显示的时候有一个方法就是监听显示是否完成,同样对于fragment也有类似的方法可以监听,如下:
@Override public void onHiddenChanged(boolean hidd) { if (hidd) {String instrName = ((MainActivity)getActivity()).getInstrName();System.out.println(当对冲界面重新恢复显示时候,得到从开仓单获取到的商品名称+instrName+***************++++++++++++*****);System.out.println(当对冲界面重新恢复显示时候,得到从开仓单获取到的商品名称+instrName+***************++++++++++++*****); } else { //相当于Fragment的onPause String instrName = ((MainActivity)getActivity()).getInstrName(); System.out.println(当对冲界面重新恢复显示时候,得到从开仓单获取到的商品名称+instrName+***************++++++++++++*****); } }这样在fragment隐藏或者显示的时候,都能够获取到共享的数据,注意点是第一次是需要new一个frament对象,这时候也要得到共享数据,只需要将代码写到oonCreateView中即可。
篇7:Android 单元测试方法与步骤
一、修改配置文件AndroidManifest.xml
< manifest xmlns:android =“schemas.android.com/apk/res/android”
package =“cn.ycmoon.test.activity” android:versionCode =“1”
android:versionName =“1.0” >
< uses-sdk android:minSdkVersion =“8” />
< application android:icon =“@drawable/icon” android:label=“@string/app_name” >
< uses-library android:name =“android.test.runner” />
< activity android:name =“.MainActivity” android:label=“@string/app_name” >
< intent-filter >
< action android:name =“android.intent.action.MAIN” />
< category android:name =“android.intent.category.LAUNCHER” />
< instrumentation android:name =“android.test.InstrumentationTestRunner”
android:targetPackage =“cn.ycmoon.test.activity” android:label=“Testing” />
说明:1、在Application节点中Activity前添加
2、在Application节点的添加
二、在相应包中编写要完方法,
三、在src同级级目录中添加一个test文件夹[可自定义],并在下建立和项目一致的包名: cn.ycmoon.test.activity四、在要进行单元测试的方法上右键->NEW->JUNIT Test Case,
Android 单元测试方法与步骤
,
弹出下界面:
选择 SuperClass为: 点击下一步,选择要测试的方法: 点击完成。将新产生的单元测试的类放入test/项目包名下。
在单元测试方法中添加实现: 展开test/cn.ycmoon.test.activity下单元测试类,选择要测试的方法,点右键,选择Run As->Android JUnit Test,就会打开单元测试结果界面。右该方法无错误,则结果会显示绿色状态条:
文档为doc格式