记录Android开发过程中,遇到的一些小问题:
1.Android代码中设置TextView的TextSize,总不能出现预期的大小,需要如下设置:
mTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
2.如果一个方法不需要使用该对象的成员,那么把该方法设置为static
静态调用比对象调用该方法快15%-20%。
3.静态内部类的使用
我们在程序中往往为了省事而顺手使用内部类实现所要功能,比如:
new Hanlder()/new Thread()/new TimerTask()
这么存在非静态内部类会持有 所在类的对象的隐患,如果该对象是Activity的话那么所带来的后果就是内存泄漏了。。 而要避免此类问题也很简单了,就是要把非静态内部类改为静态内部类,而它所持有外部类的对象则改为弱引用的形式。具体例子如下:
private static class ProgressTimerTask extends TimerTask{
WeakReference<XXXActivity> activityWeakReference;
public ProgressTimerTask(XXXActivity activity){
activityWeakReference = new WeakReference<XXXActivity>(activity);
}
@Override
public void run() {
XXXActivity activity = activityWeakReference.get();
if(activity == null){
return;
}
}
}
4.慎用AsyncTask,使用网络请求框架(Volley、OkHttp)代替
关于AsyncTask在异步网络请求方面用的非常多,因为它使用起来比较轻量,但是关于AsyncTask也存在内存泄漏和结果丢失等问题,下面一起来看看:
4.1、内存泄漏
如果在Activity中使用AsyncTask以匿名内部类的方式请求网络,由于AsyncTask的生命周期可以比Activity的长(因为请求网络数据是比较耗时的),AsyncTask内部类持有Activity的引用的话,如果还在请求网络时就关闭了Activity,那么将导致Activity对象将无法回收,进而产生内存泄漏
4.2、结果丢失
假如Activity的launchMode是默认或者是标准的,那么当AsyncTask在请求网络数据时把屏幕旋转了,那么将会重新创建一个新的Activity,又因为还在运行的AsyncTask持有之前Activity的引用,那么将导致onPostExecute()方法不起任何作用,请求获得的数据不能加载到新的Activity上,而且也将导致内存泄漏
4.3、串行和并行多版本不一致
AsyncTask在1.6之前为串行,在1.6-2.3为并行,在3.0之后又改为串行,在3.0之后虽然可以通过代码来改变默认的串行为并行,但是又是一个繁琐的操作
5.给View设置虚线不显示的问题。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="line">
<stroke
android:dashGap="3dp"
android:dashWidth="2dp"
android:width="1dp"
android:color="@color/c10" />
</shape>
<TextView
android:layout_width="match_parent"
android:layout_height="2dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layerType="software"
android:background="@drawable/custom_service_reply_divider" />
要添加
android
:layerType=
"software"属性才能正常显示虚线,调了好久,以为什么鬼问题呢。
6.点击PopupWindow外部,不消失的问题。
checkshareWindow = new PopupWindow(check_view, DensityUtil.getScreenWidth(this), WindowManager.LayoutParams.WRAP_CONTENT, true);
checkshareWindow.setBackgroundDrawable(new BitmapDrawable());
checkshareWindow.setOutsideTouchable(true);
checkshareWindow.showAtLocation(share, Gravity.BOTTOM, 0, 0);
showAtLocation方法调用之前的两行代码,这三行代码顺序不能颠倒。
7.通过这么设置可以解决全屏浮窗监听外部touch事件
this.layoutParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
| LayoutParams.FLAG_NOT_FOCUSABLE
| LayoutParams.FLAG_NOT_TOUCHABLE | LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
8.Android Studio使用Module自定义控件没提示问题
编译版本的问题,module的编译版本必须和library的一致才行,
修改module的gradle文件的compileSdkVersion和targetSdkVersion
9.Intent传递Parcelable序列化的对象、对象集合时,若对象中包含HashMap<String, Object>成员或者Bitmap成员时,
public HashMap<String, TileSizeInfo> regular_map = new HashMap<>(); public Bitmap bitmap; // 单砖的情况:regular_map全部对应bitmap位图 public HashMap<String, HashMap<String, TileSizeInfo>> tileTypeMap = new HashMap<>();
protected TileCuttingList(Parcel in) { regular_map = in.readHashMap(TileSizeInfo.class.getClassLoader()); bitmap = in.readParcelable(Bitmap.class.getClassLoader()); tileTypeMap = in.readHashMap(TileSizeInfo.class.getClassLoader()); } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeMap(regular_map); dest.writeParcelable(bitmap, 1); dest.writeMap(tileTypeMap); }