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を効率的に返す
2.現在のコレクションsizeが空かどうかを判断する
3.SharedPreferencesクリアキー値でのデータ
4.SharedPreferencesファイルデータを空にする
5.git修正git ignore後有効
gitを使用するときは、ファイルやフォルダを無視する必要があります.私たちは一般的に倉庫のルートディレクトリで作成します.gitignoreファイル
提出する前に、修正します.gitignoreファイル、無視するファイルを追加します.それからadd commit pushなどをします
ただし、過称を用いる場合には、対が必要となることがある.gitignoreファイルを再度変更します.今度はキャッシュcacheをクリアする必要があります.gitignoreが有効になります.
具体的な方法:
これにより、修正後の.gitignoreが有効になります.
6.Androidでは列挙の代わりに注釈を使用する
ステータス変数:
に値を付ける
7.RxJavaカウントダウンを実現
8.Listのローカル削除について
位置によるpositionの削除:開始位置position+count:終了位置(この位置データを含まない)
条件に従って削除
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に変更するか、他の非同期メカニズムで実行します.
11.BroadcastReceiver#onReceive()での時間のかかる操作は避ける
BroadcastReceiver#onReceive()で時間のかかる操作を実行しないでください.時間のかかる作業がある場合は、BroadcastReceiver内でサブスレッドを作成するのではなく、IntentServiceを作成して完了する必要があります.説明:この方法はメインスレッドで実行されるため、時間がかかるとUIがスムーズになりません.InentService、HandlerThreadの作成、またはContext#registerReceiver(BroadcastReceiver、InentFilter、String、Handler)メソッドの呼び出しなどを使用して、他のWrokerスレッドでonReceiveメソッドを実行できます.BroadcastReceiver#onReceive()メソッドは10秒以上かかり、システムによって殺される可能性があります.正例:
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!
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環境変数が構成されていることを確認します.
15.MacOSでandroidデータベースをパソコンにコピーする