那些相见恨晚的Android常识

记录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 activityWeakReference;        
	public ProgressTimerTask(XXXActivity activity){           
		activityWeakReference = new WeakReference(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设置虚线不显示的问题。



    
要添加 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成员或者Bitmap成员时,

public HashMap regular_map = new HashMap<>();

public Bitmap bitmap;   // 单砖的情况:regular_map全部对应bitmap位图

public HashMap> 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);
}




你可能感兴趣的:(Android)