Androidコードのテクニックをまとめてみましょう

25052 ワード

文書ディレクトリ
  • 1.汎用型の空の集合java
  • を効率的に返す
  • 2.現在のセットsizeが空の
  • であるか否かを判断する.
  • 3.SharedPreferencesクリアキー値でのデータ
  • 4.SharedPreferencesクリアファイルデータ
  • 5.git修正git ignore後有効
  • 6.Androidにおける注釈代替の使用例
  • 7.RxJava実現カウントダウン
  • 8.Listのローカル除去について
  • 9.Java 8における関連クラスの代替
  • 10.IntentServiceの使用
  • 11.BroadcastReceiver#onReceive()での時間のかかる動作を回避する
  • 12.Activity#onDestroy()内での解放リソースの実行を回避する
  • 13.さらに、符号化に関する命名規範
  • について説明する.
  • 14.MacOS下adb指令では認識できない
  • 15.MacOSでandroidデータベースをパソコン
  • にコピー
    1.汎用型の空の集合javaを効率的に返す
    Collections. emptyList()
    

    2.現在のコレクションsizeが空かどうかを判断する
    Collection.isEmpty()
    

    3.SharedPreferencesクリアキー値でのデータ
    SharedPreferences.Editor editor = userSettings.edit();
    editor.remove("KEY");
    editor.commit();
    

    4.SharedPreferencesファイルデータを空にする
    SharedPreferences.Editor editor = userSettings.edit();
    editor.clear();
    editor.commit();
    

    5.git修正git ignore後有効
    gitを使用するときは、ファイルやフォルダを無視する必要があります.私たちは一般的に倉庫のルートディレクトリで作成します.gitignoreファイル
    *.iml
    .gradle
    /local.properties
    /.idea/
    /app/mapping.txt
    /build/
    /app/build/
    /app/release/
    /app/debug/
    

    提出する前に、修正します.gitignoreファイル、無視するファイルを追加します.それからadd commit pushなどをします
    ただし、過称を用いる場合には、対が必要となることがある.gitignoreファイルを再度変更します.今度はキャッシュcacheをクリアする必要があります.gitignoreが有効になります.
    具体的な方法:
    git rm -r --cached .  #    
    git add . #  trace file
    git commit -m "update .gitignore" #     
    git push origin master #  ,       remote   
    

    これにより、修正後の.gitignoreが有効になります.
    6.Androidでは列挙の代わりに注釈を使用する
    public class Constants {
        public static final int STATE_ONE = 1;
        public static final int STATE_TWO = 2;
        public static final int STATE_THREE = 3;
    
        //        MyState
        @Retention(RetentionPolicy.SOURCE)
        @IntDef({STATE_ONE, STATE_TWO, STATE_THREE})
        public @interface  MyState {}
    }
    

    ステータス変数:
    @Constants.MyState
    private int state;
    

    に値を付ける
    private void setState(@Constants.MyState int state) {
        //some code
    }
    

    7.RxJavaカウントダウンを実現
    import io.reactivex.Flowable;
    import io.reactivex.android.schedulers.AndroidSchedulers;
    import io.reactivex.disposables.Disposable;
    
    public class SplashActivity extends BaseActivity {
       
        private Disposable mDisposable;
        
        @Override
        protected void setListener() {
        	//        
            mDisposable = Flowable.intervalRange(0, 5, 0, 1, TimeUnit.SECONDS)
                    .observeOn(AndroidSchedulers.mainThread())
                    .doOnNext(aLong -> {
                    //     
                    })
                    .doOnComplete(//     )
                    .subscribe();
        }
        @Override
        protected void onDestroy() {
           	closeTimeDown();
            super.onDestroy();
        }
        private void closeTimeDown() {
            if (null != mDisposable && !mDisposable.isDisposed()) {
                mDisposable.dispose();
                mDisposable = null;
            }
        }
    }
    

    8.Listのローカル削除について
    位置によるpositionの削除:開始位置position+count:終了位置(この位置データを含まない)
    List.subList(position, position + count).clear();
    

    条件に従って削除
    List<String> list = new ArrayList<>(); 
    list.add("1");
    list.add("2");
    Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) {
    	String item = iterator.next(); 
    	if (       ) {
    		iterator.remove(); 
    	}
    } 
    

    9.Java 8における関連クラスの代替
    JDK 8のアプリケーションの場合、Dateの代わりにInstant、Calendarの代わりにLocalDateTime、SimpleDateFormatの代わりにDateTimeFormatterを使用できます.公式の説明:simple beautiful strong immutable thread-safe
    volatileはマルチスレッドメモリの非表示の問題を解決します.書き込みマルチリードの場合、変数同期の問題は解決できますが、マルチ書き込みの場合、スレッドセキュリティの問題も解決できません.count++操作の場合、AtomicInteger count=new AtomicInteger()というクラスの実装が使用されます.count.addAndGet(1); JDK 8の場合は、AtomicLongよりもLongAdderオブジェクトを使用することをお勧めします(楽観的なロックの再試行回数を減らす)
    10.IntentServiceの使用
    Service#onStartCommand()/onBind()メソッドでの時間のかかる操作は避け、必要に応じてInentServiceに変更するか、他の非同期メカニズムで実行します.
    public class MainActivity extends Activity {
    	@Override
    	public void onCreate(Bundle savedInstanceState){
    		super.onCreate(savedInstanceState); setContentView(R.layout.main);
    	}
    	public void startIntentService(View source) {
    		Intent intent = new Intent(this, MyIntentService.class);
    		startService(intent); 
    	}
    	
    }
    
    public class MyIntentService extends IntentService {
    	public MyIntentService() {
    		super("MyIntentService"); 
    	}
    	@Override
    	protected void onHandleIntent(Intent intent){
    		synchronized (this) {
    			try {
    				......
    			} catch (Exception e) {
    			} 
    		}
    	} 
    }
    

    11.BroadcastReceiver#onReceive()での時間のかかる操作は避ける
    BroadcastReceiver#onReceive()で時間のかかる操作を実行しないでください.時間のかかる作業がある場合は、BroadcastReceiver内でサブスレッドを作成するのではなく、IntentServiceを作成して完了する必要があります.説明:この方法はメインスレッドで実行されるため、時間がかかるとUIがスムーズになりません.InentService、HandlerThreadの作成、またはContext#registerReceiver(BroadcastReceiver、InentFilter、String、Handler)メソッドの呼び出しなどを使用して、他のWrokerスレッドでonReceiveメソッドを実行できます.BroadcastReceiver#onReceive()メソッドは10秒以上かかり、システムによって殺される可能性があります.正例:
    IntentFilter filter = new IntentFilter(); 
    filter.addAction(LOGIN_SUCCESS); 
    this.registerReceiver(mBroadcastReceiver, filter); 
    mBroadcastReceiver = new BroadcastReceiver() {
    	@Override
    	public void onReceive(Context context, Intent intent) {
    		Intent userHomeIntent = new Intent(); 
    		userHomeIntent.setClass(this, UseHomeActivity.class); 
    		this.startActivity(userHomeIntent); 
    	}
    };
    

    12.Activity#onDestroy()内でリソースの解放を実行しない
    Activity#onDestroy()内でリソースを解放する作業を実行しないでください.たとえば、onDestroy()の実行が遅くなる可能性があるため、一部の作業スレッドの破棄や停止などです.実際の必要に応じて、Activity#onPause()/onStop()において、isFinishing()の判断と併せて実行することができる.
    13.コード化に関するネーミング仕様について
    クラス名はUpperCamelCaseスタイルを使用し、メソッド名、パラメータ名、メンバー変数、ローカル変数はlowerCamelCaseスタイルを統一的に使用します.
    定数の命名はすべて大文字で、単語の間は下線で隔てられて、意味の表現が完全にはっきりしていることを求めて、名前が長いことを嫌がらないでください.
    パッケージ名は小文字で統一され、ポイントセパレータの間に自然な意味を持つ英語の単語が1つしかありません.パッケージ名は単数形式で統一されていますが、クラス名に複数の意味がある場合は、クラス名は複数形式で使用できます.
    抽象クラス名はAbstractまたはBaseの先頭を使用します.例外クラス名はExceptionの末尾を使用します.テストクラス名は、テストするクラスの名前で始まり、Testで終わります.
    POJOクラスのブールタイプの変数には、is接頭辞を付けないでください.
    モジュール、インタフェース、クラス、メソッドが設計モードを使用している場合は、名前を付けるときに具体的なモードを体現する必要があります.
    インタフェースクラスのメソッドとプロパティは、修飾記号を付けないでください.できるだけインタフェースで変数を定義しないでください.変数を定義する必要がある場合は、インタフェースメソッドに関連しており、アプリケーション全体の基礎定数です.
    インタフェースの名前(1)サービスとDAOクラス:CacheServiceImplがCacheServiceインタフェース(2)形容詞能力を実現するインタフェース:AbstractTranslatorがTranslatableインタフェースを実現する.
    列挙クラス名はEnum接尾辞を付けることを推奨し、列挙メンバー名は全大文字で、単語間は下線で区切らなければならない.
    14.MacOS下adb指令が認識できない
    まずadb環境変数が構成されていることを確認します.
  • 1.端末入力コマンドラインを開くopenを入力する.zshrcリターン.
  • 2.開いたファイルの中に#User configurationの部分を見つけて、それにぴったりくっついてsource~/を追加します.bash_profile.
  • 3.ファイルの完了をクリックし、コマンドラインにsourceを入力します.zshrcリターン.
  • 4.adbコマンドを実行して解決に成功しました.

  • 15.MacOSでandroidデータベースをパソコンにコピーする
  • 1.デバイスを挿入し、コマンドラインまたは端末からadb shellを実行します.
  • 2.shellでrun-as com.myapplication.packagname(コピーしたいパッケージ名).
  • 3.その後CDはデータベースフォルダcd databasesに入ります.
  • 4.cat my_を実行しますdatbase_name.db(データベース名)>/sdcard/my_database_name_temp.db(コピーされたデータベース名).
  • 5.exitを実行し、再びexitを実行して正常な端末プロンプトに戻ります.
  • 6.cd指定ディレクトリへadb pull/sdcard/my_を実行database_name_temb.db ,OK!