憎しみ合うAndroidの常識
5505 ワード
Androidの開発過程で発生したいくつかの小さな問題を記録します.
1.AndroidコードにTextViewのTextSizeを設定すると、予想されるサイズは常に表示されません.以下の設定が必要です.
1.AndroidコードにTextViewのTextSizeを設定すると、予想されるサイズは常に表示されません.以下の設定が必要です.
mTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
2.メソッドがオブジェクトのメンバーを使用する必要がない場合は、メソッドをstaticに設定します.15%-20%。
3.静的内部クラスの使用
プログラムでは、内部クラスを使用して、手間を省くために必要な機能を実現することがよくあります.たとえば、次のようにします.このように静的でない内部クラスが存在するクラスのオブジェクトを持つ危険性があり、そのオブジェクトがActivityであればメモリ漏れの結果となります.このような問題を回避するのも簡単です.非静的内部クラスを静的内部クラスに変更し、外部クラスを持つオブジェクトを弱い参照形式に変更します.具体例は以下の通りです.new Hanlder()/new Thread()/new TimerTask()
4.AsyncTaskの使用を慎み、ネットワーク要求フレームワーク(Volley、OkHttp)を使用します.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; } } }
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の外部をクリックし、消えない問題.showAtLocationメソッドは、前の2行のコードを呼び出します.この3行のコードの順序は逆転できません.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);
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); }