憎しみ合うAndroidの常識

5505 ワード

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メソッドは、前の2行のコードを呼び出します.この3行のコードの順序は逆転できません.
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ファイルのcompileSdkVarsionとtargetSdkVarsionの変更
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);
}