知識アップ!90%のAndroidの開発者は、Android開発の寒さの知識を知りません

1. YYYY yyyyは同じではありません

2019年12月31日で、例えば:

YYYY-MM-DD:2019年12月31日

YYYY-MM-DD:2020年12月31日

私は大物の多くは、物品を説明するために詳細に書かれている、あなたはすでに知っていることを信じて、だけでなく、直接、公式の説明のSimpleDateFormatを参照してください。

要するに:Yは、週年度指し週の年に属し表し、私たちは、今年の毎日をyで表されます。

2. getReadableDatabase開いていない読み取り専用データベース

getWritableDatabaseでアンドロイド()とgetReadableDatabase()メソッドは、SQLiteDatabaseインスタンスを取得することができます。

しかしgetReadableDatabaseは()読み取り専用データベースをオープンしましたが、最初の実行getWritableDatabase()、唯一のオープン読み取り専用データベースに障害が発生した場合にされていません。..

ソースとして、次のとおりです。

public synchronized SQLiteDatabase getReadableDatabase() {
    // ...
    try {
        // 执行 getWritableDatabase() , 若出现异常,以只读方式打开数据库
        return getWritableDatabase();
    } catch (SQLiteException e) {
        if (mName == null) throw e;  
    }
    SQLiteDatabase db = null;
    try {
        // ... 
        // 以只读方式打开数据库
        db = SQLiteDatabase.openDatabase(path, mFactory, SQLiteDatabase.OPEN_READONLY);
        // ... 
        mDatabase = db;
        return mDatabase;
    } finally {
        // ... 
    }
}

3.子供は必ずしもUIスレッドを更新することはできません

複数のスレッドのアクセスが安全でないときにAndroidのUIが、ロックされていない訪問。そのため、規定はUIスレッドでUIにのみアクセスすることができます。

スレッドをチェックするための責任checkThreadのViewRootImpl()メソッドは、次のとおりです。

void checkThread() {
    if (mThread != Thread.currentThread()) {
        throw new CalledFromWrongThreadException(
                "Only the original thread that created a view hierarchy can touch its views.");
    }
}

しかし、ViewRootImpl後onResume()コールバックで作成されました。だから、onResume()の前に、それはUIを更新することができ、サブスレッドもあります。

ViewRootImplが作成した後でも、彼らはcheckThread()を呼び出していない、サブスレッドの更新も文句はありません。

しかし、我々は、UI子スレッドを開発したり、更新しないでください。

4.ビューのコードでは、新しいIDではありません

ID +を介してAndroidのレイアウトファイル、Rは、実行時に、リソースの一意性を保証するために、のIntの値に対応するファイルで発生するが、新たな動的コード表示ないIDであってもよいです。

あなたはそのIDを使用する必要がある場合は、代わりに乱数で特定の値または手書きの生成、IDを(API17 +)を生成するビューgenerateViewId()メソッドを呼び出すことができます。

5.ビューのリターンは必ずしものgetContext活動ではありません

アクティビティアクティビティは、特定のsetContentViewです。

いくつかの方法で、ビューを、View.inflate、LayoutInflater.inflateこれを新しいビューを追加することで、我々は質量の参加がどのような文脈、ビューコンテキストとは何であるので説教したとき。

AppCompatActivity、その後、getConext方法ビューから継承された携帯電話システムバージョン5.0以下であり、アクティビティで、リターンは活動が、TintContextWrapperではないだろう。

6. RemoteViewsと何も表示しています

RemoteViewsは、主に開発通知バーとデスクトップウィジェットのため、クロスプロセス更新の動作のための基礎を提供します。

名前から、私の感触では、リモートビューでなければなりません。次のように実際には、ソースコードは、次のとおりです。

public class RemoteViews implements Parcelable, Filter {
    // ...
}

すべてのすべては、RemoteViewsは、クロスプロセス・コントロールを操作すると、クラスのメソッドの範囲を提供することです。

7. boolean型は、数バイトを占有します

Javaのbooleanにおける実際の情報は、いずれかを示します。真のための1、0がfalseを表します。しかし、Javaの仕様データ・タイプの文書は、正確に実際のメモリサイズブール変数を定義していません。

仮想マシンに関連付けられ、その大きさは、あなたが1ビットではないことを確認することができます。

次のようにJava仮想マシンの推奨事項は、次のとおりです。

  1. ブール型は4バイトで、int型を使用するようにコンパイルされています。
  2. ブール配列はバイト配列型にコンパイルされ、ブール値のアレイの各メンバーは、バイトを占め

ファイルレイアウト8 RecyclerViewはspanCountのlayoutManagerで指定することができます

RecyclerViewレイアウトファイルはspanCountのlayoutManagerを指定することができます

<declare-styleable name="RecyclerView">        
    <attr name="layoutManager" format="string" />
    <attr name="android:orientation" />
    <attr name="spanCount" format="integer"/>
    <attr name="reverseLayout" format="boolean" />
    <attr name="stackFromEnd" format="boolean" />
</declare-styleable>

ののlayoutManager、spanCount、方向を指定することができ、そのプロパティをATTR。私たちは、コードで設定する必要はありません。

9. 9パッチ画像がパディングされています

NinePatchDrawableパターンは、それがバックグラウンドビューとして使用することができ、伸縮性のビットマップです。アンドロイドは自動的にコンテンツビューに合わせてグラフィックのサイズを調整します。追加の1つのピクセルの境界線が含まれている、あなたは、プロジェクトの解像度/描画可能/ディレクトリに保存されます9.png拡張子を使用する必要があります。

アクションのライン:

フィットの画像に画像のピクセルをコピーすることが許可されている人の定義:上左。

右、下:場所の相対ビューエリアは、許可された画像の内容を定義します。

したがって、9パッチ画像は、パディングを含むことができるコントロールが明示的に設定されていない場合、画像は、パディング制御パディングとして使用されます。

だから、時々、アンドロイド:パディング=「0dpは」書き込みも書かれていました。

10.ハードウェアアクセラレーションスイッチができない場合

レンダリング加速グラフィックスを実現するためにGPUに直接依存しているハードウェアアクセラレーション。効率を向上させるだけでなく、描画機構の変化による、大幅インタフェースリフレッシュコンテンツ変更の効率を向上させるだけでなく、レンダリングGPUの導入以来。

デフォルトで有効になって始めAndroid4.0ハードウェアアクセラレーションでは、手動で開閉を制御することができます。

それに注意してください。

ウィンドウのハードウェアアクセラレーションレベルだけではない近くに開くことができ、Viewクラスは唯一のオープンに閉じていません。

アプリケーションとアクティビティ制御

アプリケーションまたはアクティビティノードがAndroidManifestファイルに追加され

android:hardwareAccelerated="true"

ウィンドウの制御

getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED)

ビューコントロール

view.setLayerType(View.LAYER_TYPE_SOFTWARE,null);

オープンハードウェアアクセラレーションにかどうかを照会

View.isHardwareAccelerated()
Canvas.isHardwareAccelerated()

11. getVisibility()ユーザーがよくない見ることができるかどうかを決定します

getVisibility()は、それ自体が唯一の表示状態であるか否かを判定する。しかし、それが表示されていない場合は親にありますか?

isShown()メソッドがより適切であると、第1の判定が表示されていない、現在のビュー内のフラグを決定し、親ビューを取得するためにループします。限り、1が表示されていないとして、それはfalseを返します。

ソースとして、次のとおりです。

public boolean isShown() {
    View current = this;
    //noinspection ConstantConditions
    do {
        if ((current.mViewFlags & VISIBILITY_MASK) != VISIBLE) {
            return false;
        }
        ViewParent parent = current.mParent;
        if (parent == null) {
            return false; // We are not attached to the view root
        }
        if (!(parent instanceof View)) {
            return true;
        }
        current = (View) parent;
    } while (current != null);
    return false;
}

知識の多くは、いくつかの場所を確認するのを忘れている、ブログ、これも再び大物への敬意を払う様々なオンライン大物から来ています!

また、参考になりましたが、この記事はあなたが賞賛のハを指すことを願っている場合~~

私は仕上げの独自のコレクションを共有する兄持ってここで、あなたは非常にあなたがここに見ることができるものを教えてくださいありがとうAndroidは、アーキテクチャPDF +動画+インタビュー+ドキュメント・ソース・ノート勉強だけでなく、高度な技術アーキテクチャ高度な脳マッピングを、Androidのインタビューテーマの開発情報シニア高度なスキーマ情報は、これらを繰り返し細かい材料を読みます私のレジャーです。マインドマップでは、各ポイントは、実際のプロジェクトに対応するトピックの知識が装備され、効果的にあなたが知識ポイントを把握するのに役立つことができます。

要するに、私たちは、高度な学習強化ここで助けにもありますが、またあなたは、オンライン検索データを学習する時間を節約するにも一緒に勉強親しい友人と共有することができます

あなたが必要としている場合は、次のことが可能にコメント私に従うこちらをクリックしてくださいまたはVxのを追加:15388039515(注CSDN、必要情報)

画像

画像

画像

画像

公開された200元の記事 ウォン称賛83 ビュー70000 +

おすすめ

転載: blog.csdn.net/weixin_45258969/article/details/104783125