android面试总结1

来源:互联网 发布:淘宝宝贝链接 编辑:程序博客网 时间:2024/04/27 16:26
以下是本人近期面试中面试官问到的问题,在网上搜集了一番,做个记录,以后看起来也方便。
1.xml三种解析方式:dom,sax,pull(推荐使用)
参考文章:http://blog.csdn.net/WILLMAX_007/article/details/51416963
总结:三种方式的总结比较
SAX是一个用于处理XML事件驱动的“推”模型, 
优点:是一种解析速度快并且占用内存少的xml解析器,它需要哪些数据再加载和解析哪些内容。 stringbuilder.apppend,可以随时解析节点,添加节点
缺点:是它不会记录标签的关系,而要让你的应用程序自己处理,这样就增加了你程序的负担。
DOM是一种文档对象模型,DOM可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构。 
优点:Dom技术使得用户页面可以动态地变化,如可以动态地显示或隐藏一个元素,改变它们的属性,增加一个元素等,Dom技术使得页面的交互性大大地增强。 
缺点:是DOM解析XML文件时,会将XML文件的所有内容以文档树方式存放在内存中。
Pull解析和Sax解析很相似,Pull解析和Sax解析不一样的地方是pull读取xml文件后触发相应的事件调用方法返回的是数字,还有pull可以在程序中控制想解析到哪里就可以停止解析。while循环,可以随时改变条件退出循环
DOM方式最直观和容易理解,但是只适合XML文档较小的时候使用,而SAX方式更适合在移动终端系统中使用,因为相比DOM占用内存少,适合处理比较大的XML文档,最后的Pull方式使用场合和SAX类似,但是更适合需要提前结束XML文档解析的场合。
----------------------------------------------------------------------------------
2. json解析
JSON文件就相当于是一个数组
解析JSON文件就相当于遍历存储JSON对象的数组JSONArray,获取每个JSONObject的数据,并封装到javabean中
JSON的优缺点:
优点:
作为数据传输格式,跟XML类似,但是比XML更加轻巧
由于JSON是JavaScript的原生格式,所以JSON不需要包含特定内容的首部信息
缺点:
语法过于严谨
代码可读性差
其eval函数存在风险
-----
使用第三方开源库,Gson,FastJson,JackJson。项目中用到Gson
参考文章:https://www.cnblogs.com/gzdaijie/p/5189542.html
1.引用Gson 2.6.1 版本jar包
2.toJson(对象参数),将对象转化成json字符串
3.fromJson(jason字符串参数,对象参数),将json字符串转换成对象
-----------------------------------------------------------------------------------------
3.动画
参考文章:http://blog.csdn.net/yuzhiboyi/article/details/7731826

补间动画:
局限性
1.它只是重回了动画,并不具有交互性,不能做交互的动画效果;
2.由于animation动画框架是不断的调取ondraw方法进行重回,多以很费cpu资源。
-----------------------------------
帧动画
放电影
-----------------------------------
属性动画
第一种用法ObjectAnimator继承自ValueAnimator
ObjectAnimator animatorA = ObjectAnimator.ofFloat(iv,"TranslationX", -300,300,0);
animatorA.star(),异步执行属性动画
-----------------------------------
第二种用法:
PropertyValuesHolderp1=PropertyValuesHolder.ofFloat("TranslationX",0f,300f);
ObjectAnimator.ofPropertyValuesHolder(iv,p1).setDuration(1000).start();
----------------------------------- 
AnimatorSet用法
//AnimatorSet 用法
ObjectAnimator animatorA = ObjectAnimator.ofFloat(iv,"TranslationX",0,300f);
ObjectAnimator animatorAA = ObjectAnimator.ofFloat(iv,"TranslationY",0,300f);
ObjectAnimator animatorB = ObjectAnimator.ofFloat(iv,"scaleY",0.5f,1.5f);
ObjectAnimator animatorC = ObjectAnimator.ofFloat(iv,"rotation",0,270);
AnimatorSet animatorSet=newAnimatorSet();
animatorSet.playTogether(animatorA, animatorAA,animatorB, animatorC);//同时播放
//animatorSet.playSequentially(animatorA, animatorB, animatorC);//顺序播放
// animatorSet.play(animatorA).after(animatorC).before(animatorB);//翻转c->移动a ->缩放b。执行动画a,在动画c之后,在动画b之前,b动画在C之后

animatorSet.setDuration(1000);
animatorSet.start();
-----------------------------------
动画监听器
1.new Animator.Animatorlistener (系统给我们补充好多多余的方法)
animatorA.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {

}

@Override
public void onAnimationEnd(Animator animation) {

}

@Override
public void onAnimationCancel(Animator animation) {

}

@Override
public void onAnimationRepeat(Animator animation) {

}
});
2.newAnimatorListenerAdapter(只需要实现我们需要实现的方法即可,比如动画结束时执行一个Toast)
animatorA.addListener(newAnimatorListenerAdapter() {
@Override
public voidonAnimationEnd(Animator animation) {
Toast.makeText(SecondActivity.this,"over", Toast.LENGTH_SHORT).show();
}
});
-----------------------------------
插值器 设置怎么实现动画 animator.setInterpolator(new 动画插值器)
(卫星菜单的应用)
-----------------------------------
ValueAnimator (相当于定时器的动画效果,从0-100)
public voidclick(View view) {
if(view.getId() == R.id.tv) {
ValueAnimator animator = ValueAnimator.ofInt(0,100);
animator.setDuration(5000);
animator.addUpdateListener(newValueAnimator.AnimatorUpdateListener() {
@Override
public voidonAnimationUpdate(ValueAnimator animation) {
Integer i = (Integer) animation.getAnimatedValue();
tv.setText(""+ i);
}
});
animator.start();
}
}
-------------------------------------------------------------------------------------------
4.利用广播监听手机电量(考点:动态注册广播,onDestory中要取消注册广播)
private void useBroadCoastListenLevel() {
//利用广播监听手机电量 并显示
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
//动态注册广播
receiver = new BatteryReceiver();
registerReceiver(receiver, intentFilter);
}

public class BatteryReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (Intent.ACTION_BATTERY_CHANGED.equals(action)) {
int level = intent.getIntExtra("level", 0);
tvB.setText("当前电量:" + level+"%");
if (level < 30) {
tvB.setText("电量小于:" + level + "% 请充电");
}
}
}
}
-----------切记--------------
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}