项目笔记2
来源:互联网 发布:java桌面应用开发框架 编辑:程序博客网 时间:2024/06/14 22:02
项目笔记:
1、Gson在功能上面无可挑剔,在性能上面比FastJson差点
FastJson在复杂类型的Bean转Json上会出现一些问题,可能会出现引用类型,导致JSON转换出错,需要定制引用
FastJson由阿里巴巴采用独创的算法,将parse速度提升到极致,超过所有json库
如果性能上面有要求,可使用Gson将bean转换为json确保数据的正确,使用FastJson将JSON转为bean
bean转json用Gson:
Gson gson = new Gson();
String json = gson.toJson(obj);
json转bean用FastJson:
Bean bean = JSON.parseObject(json,Bean.class);
json转复杂bean用FastJson:
List list = JSON.parseObject(json,new TypeReference<ARRAYLIST>(){});
Set set = JSON.parseObject(json,new TypeReference<HASHSET>(){});
json转bean用GSON(不在乎性能):
Gson gson = new Gson();
Bean bean = gson.fromJson(json,Bean.class);
json转复杂bean用Gson(不在乎性能):
Gson gson = new Gson();
List<Bean> beanList = gson.fromJson(json,new TypeToken<List<Bean>>(){}.getType());
2、Java泛型(泛型类获取实例对象方法)
参数:Class<T> classN
T info = classN.newInstance();(当T有无参构造函数时)
T info = classN.getConstructor(JSONObject.class).newInstance(jsonObject)(当T要用到有参构造函数时)
--JSONObject.class为参数类型,jsonObject为传进来的数据
3、关于子类父类构造方法:
class A{
public A(){};
public A(String name){};
}
class B extends A{
}
--子类不能继承父类的构造方法,但是实例化子类的时候会调用父类的构造方法
--B没有申明构造方法的时候,可以用new B(),此时子类会自动调用父类的无参构造函数
--B中申明一个有参构造函数public B(String name){},new B("haha")会先调用父类的无参构造函数,再调用子类的构造函数
--子类实例化对象时,如果子类构造函数没有显示调用父类构造器,子类会自动调用父类的无参构造函数
--如果父类没有申明无参构造函数,子类构造器没有显示调用父类构造器,则编译报错
4、Error:java.lang.RuntimeException: Annotation processors must be explicitly declared now.
The following dependencies on the compile classpath are found to contain annotation processor. Please add them to the annotationProcessor configuration
解决办法:(注解适配问题,新的gradle插件不再支持annotation processors)
在module的build.gradle文件的defaultConfig里面配置
javaCompileOptions{
annotationProcessorOptions{
includeCompileClasspath false
}
}
5、ButterKnife(解放控件对象实例化findViewById,解放各种点击事件比如setOnClickListener)
用法:
build.gradle文件配置:
compile 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
在setContentView(R.layout.activity_main)之后加一句ButterKnife.bind(this);
获取控件对象实例:
@BindView(R.id.button01)
Button button01;
控件点击事件实现方法一:
button01.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this,"李易峰",Toast.LENGTH_LONG).show();
}
});)
控件点击事件实现方法二:
@OnClick(R.id.button02)
void btnClick(){
Toast.makeText(MainActivity.this,"李钟硕",Toast.LENGTH_LONG).show();
}
6、android 闹钟设置
//定时检查 AbsWorkService 是否在运行,如果不在运行就把它拉起来
//Android 5.0+ 使用 JobScheduler,效果比 AlarmManager 好
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
JobInfo.Builder builder = new JobInfo.Builder(HASH_CODE, new ComponentName(DaemonEnv.sApp, JobSchedulerService.class));
builder.setPeriodic(DaemonEnv.getWakeUpInterval());
//Android 7.0+ 增加了一项针对 JobScheduler 的新限制,最小间隔只能是下面设定的数字
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) builder.setPeriodic(JobInfo.getMinPeriodMillis(), JobInfo.getMinFlexMillis());
builder.setPersisted(true);
JobScheduler scheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
scheduler.schedule(builder.build());
} else {
//Android 4.4- 使用 AlarmManager
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent i = new Intent(DaemonEnv.sApp, DaemonEnv.sServiceClass);
sPendingIntent = PendingIntent.getService(DaemonEnv.sApp, HASH_CODE, i, PendingIntent.FLAG_UPDATE_CURRENT);
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + DaemonEnv.getWakeUpInterval(), DaemonEnv.getWakeUpInterval(), sPendingIntent);
}
//使用定时 Observable,避免 Android 定制系统 JobScheduler / AlarmManager 唤醒间隔不稳定的情况
sDisposable = Observable
.interval(DaemonEnv.getWakeUpInterval(), TimeUnit.MILLISECONDS)
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
DaemonEnv.startServiceMayBind(DaemonEnv.sServiceClass);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
throwable.printStackTrace();
}
});
//守护 Service 组件的启用状态, 使其不被 MAT 等工具禁用
getPackageManager().setComponentEnabledSetting(new ComponentName(getPackageName(), DaemonEnv.sServiceClass.getName()),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
/**
* 最近任务列表中划掉卡片时回调
*/
@Override
public void onTaskRemoved(Intent rootIntent) {
onEnd(rootIntent);
}
//启动前台服务而不显示通知的漏洞已在 API Level 25 修复
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.N) {
//利用漏洞在 API Level 17 及以下的 Android 系统中,启动前台服务而不显示通知
startForeground(HASH_CODE, new Notification());
//利用漏洞在 API Level 18 及以上的 Android 系统中,启动前台服务而不显示通知
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2)
DaemonEnv.startServiceSafely(new Intent(getApplication(), WorkNotificationService.class));
}
//判断本机上是否有能处理当前Intent的Activity
PackageManager pm = DaemonEnv.sApp.getPackageManager();
List<ResolveInfo> list = pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
当list != null && list.size() > 0时表明有能处理当前Intent的Activity
//防止华为机型未加入白名单时按返回键回到桌面再锁屏后几秒钟进程被杀
public static void onBackPressed(Activity a) {
Intent launcherIntent = new Intent(Intent.ACTION_MAIN);
launcherIntent.addCategory(Intent.CATEGORY_HOME);
a.startActivity(launcherIntent);
}
学习链接:http://www.jianshu.com/p/1f919c6eeff6
- 项目笔记2
- 项目开发笔记2
- 项目笔记2
- ERP项目笔记2
- 项目笔记2
- 软件项目管理 笔记2
- 视频项目笔记(2)
- 项目笔记
- 项目笔记
- 项目笔记
- 项目笔记
- 项目笔记
- 项目笔记
- 项目笔记
- 项目 笔记
- 项目笔记
- 项目笔记
- 项目笔记
- [Python]
- IOS集成ijkplayer
- python 输出练习
- group_concat()加上order by/group by会被截取字符串的解决办法
- java 解压zip文件
- 项目笔记2
- 数据结构学习心得体会
- Spring注解配置定时任务<task:annotation-driven/>
- Android Paint 画笔的一些偏知识
- 第11周项目2—操作用邻接表存储的图
- 微信支付接口境内商户版、境内服务商版区别
- Windows进程间共享socket与窗口句柄的体会
- 改变图片透明度
- java——保证原子性操作的CAS算法