文章目錄
- 1.高效的返回一個帶泛型的空集合java
- 2.判斷當前集合size是否爲空
- 3.SharedPreferences清空Key值下的數據
- 4.SharedPreferences清空文件數據
- 5.git 修改.git ignore後生效
- 6.Android中使用註解替代枚舉
- 7.RxJava實現倒計時
- 8.關於List的局部移除
- 9.相關類在Java8中的替代
- 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清空Key值下的數據
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.相關類在Java8中的替代
如果是 JDK8 的應用,可以使用 Instant 代替 Date,LocalDateTime 代替 Calendar, DateTimeFormatter 代替 SimpleDateFormat,官方給出的解釋:simple beautiful strong immutable thread-safe
volatile 解決多線程內存不可見問題。對於一寫多讀,是可以解決變量同步問題, 但是如果多寫,同樣無法解決線程安全問題。如果是 count++操作,使用如下類實現: AtomicInteger count = new AtomicInteger(); count.addAndGet(1); 如果是 JDK8,推 薦使用 LongAdder 對象,比 AtomicLong 性能更好(減少樂觀鎖的重試次數)
10.IntentService的使用
避免在 Service#onStartCommand()/onBind()方法中執行耗時操作,如果確 實有需求,應改用 IntentService 或採用其他異步機制完成。
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()中執行耗時操作,如果有耗時工作, 應該創建 IntentService 完成,而不應該在 BroadcastReceiver 內創建子線程去做。
說明:
由於該方法是在主線程執行,如果執行耗時操作會導致 UI 不流暢。可以使用 IntentService 、 創建 HandlerThread或者調用 Context#registerReceiver
(BroadcastReceiver, IntentFilter, 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 風格。
常量命名全部大寫,單詞間用下劃線隔開,力求語義表達完整清楚,不要嫌名字長。
包名統一使用小寫,點分隔符之間有且僅有一個自然語義的英語單詞。包名統一使用 單數形式,但是類名如果有複數含義,類名可以使用複數形式。
抽象類命名使用 Abstract 或 Base 開頭;異常類命名使用 Exception 結尾;測試類命名以它要測試的類的名稱開始,以 Test 結尾。
POJO 類中布爾類型的變量,都不要加 is 前綴。
如果模塊、接口、類、方法使用了設計模式,在命名時需體現出具體模式。
接口類中的方法和屬性不要加任何修飾符號,儘量不要在接口裏定義變量,如果一定要定義變量,肯定是與接口方法相關,並且是整個應用的基礎常量。
接口的命名
(1)Service 和 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!