開發故事中的各種小蟲(持續更新)
1.SnappyDb的使用: 在使用中只要類似如下對其進行良好的封裝後,儲存取值類似於hashmap的鍵值對,非常方便
public <T> void putVal(String key, T value){ if( snappydb == null ) { return ; } synchronized (snappydb) { try { snappydb.put(key, value); } catch (Exception e) { e.printStackTrace(); } } } public <T> T getVal(String key, Class<T> tClass){ if( snappydb == null ) { return null; } synchronized (snappydb) { try { return snappydb.getObject(key, tClass); } catch (Exception e) { e.printStackTrace(); } } return null; } public void DeleteVal(String key){ if( snappydb == null ) { return ; } synchronized (snappydb) { try { snappydb.del(key); } catch (Exception e) { e.printStackTrace(); } } }
該資料庫具體使用詳細見(https://github.com/nhachicha/SnappyDB#cookbook) 中介紹,這裡只說問題,在初始化的時候原api寫法有些問題如下:
這樣寫的結果就是使用者在解除安裝應用的時候,無法解除安裝資料庫,而且在部分華為機型上不能使用,應改為:DB snappyDB = new SnappyDB.Builder(context) .directory(Environment.getExternalStorageDirectory().getAbsolutePath()) //optional .name("books")//optional .build();
snappydb = new SnappyDB.Builder(context) //android 程式預設的安裝檔案路徑是data/data/包名, // 獲取/data/data/您的應用/cache,使用context.getCacheDir() // 將快取資料儲存到這個路徑下,軟體解除安裝的時候,快取資料會自動清除 .directory(context.getCacheDir()+"") .name("xxxx"+getProcessName(context)) .build();
2.小米手機桌面圖示問題:這個問題其實並不屬於開發問題,但當時的確困擾一陣。在應用更換了新的圖示後,執行在小米手機上2--3秒後,應用圖示會自動切換為原有圖示。 解決方案:小米應用商店會有個最佳圖示上傳,如果應用切換了圖示,最佳圖示沒更換,會變回最佳圖示
3.Java的Double資料型別toString的問題:在做應用錢包的功能的時候,資料型別選擇了double型別。測試在測試的時候用了大於七位數的金額時候報錯,debug發現,double的toString方法會採取科學計數法。
4.解決上傳圖片三星部分手機圖片顛倒翻轉等問題:
<span style="white-space:pre"> </span> <pre name="code" class="java">public static Bitmap RotateBitmap(String path, Bitmap bitmap) {
int degree = 0;
try {
//獲取圖片糾正的角度
ExifInterface exifInterface = new ExifInterface(path);
int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree = 270;
break;
}
//根據角度重新建立一個bitmap
Matrix matrix = new Matrix();
matrix.postRotate(+degree);
int width = bitmap.getWidth();
int height = bitmap.getHeight();
bitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
} catch (IOException e) {
e.printStackTrace();
}catch (OutOfMemoryError e){
e.printStackTrace();
}
return bitmap;
}
5. Instant Run requires 'Tools | Android | Enable ADB integration' to be enabled.
Instant Run requires 'Tools | Android | Enable ADB integration' to be enabled.
無法編譯,報錯為 Instant Run requires 'Tools | Android | Enable ADB integration' to be enabled.
解決方法:Tools--------Android-----Enable ADB Integration
6.E/MessageQueue-JNI: java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. Make sure your adapter calls notifyDataSetChanged() when its content changes. [in ListView(2131625482, class android.widget.ListView) with Adapter(class com.xxxx.home.adapter.PopwindowAdapter)]
這個錯誤,發生情況在選擇房屋所在城市,原始碼在點選的時候獲取網路並在網路返回結果後調取了一個自定義的dialog,該dialog佈局為listview.
解決方法:不要在網路返回中去調取dialog。listview本身是一個執行緒不穩定的控制元件,在載入資料的時候只能在UI執行緒中進行。
7.
ActivityThread: mtprof entry can not be found
java.io.FileNotFoundException: /proc/mtprof/status: open failed: ENOENT (No such file or directory)
at libcore.io.IoBridge.open(IoBridge.java:496)
at java.io.FileInputStream.<init>(FileInputStream.java:76)
at java.io.FileInputStream.<init>(FileInputStream.java:103)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1494)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5692)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
at libcore.io.Posix.open(Native Method)
at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
at libcore.io.IoBridge.open(IoBridge.java:482)
at java.io.FileInputStream.<init>(FileInputStream.java:76)?
at java.io.FileInputStream.<init>(FileInputStream.java:103)?
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1494)?
at android.os.Handler.dispatchMessage(Handler.java:111)?
at android.os.Looper.loop(Looper.java:194)?
at android.app.ActivityThread.main(ActivityThread.java:5692)?
at java.lang.reflect.Method.invoke(Native Method)?
at java.lang.reflect.Method.invoke(Method.java:372)?
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)?
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)?
這個錯誤報的很詭異,完全沒有指明哪行程式碼,現象就是進入頁面直接崩潰了。谷歌了一下也沒有發現好的解釋和解決方法,大部分都是說在讀取檔案時候產生的錯誤。但很明顯,我的程式碼在這裡並沒有任何讀取檔案。思索了下,讀取檔案,於是我就試著仔細看了下xml佈局檔案,還有findviewbyid(),這時候發現有控制元件的id和別的xml檔案裡的控制元件重名了,於是指向了另外的xml檔案,重新命名控制元件id完美解決。
但是,對於為什麼報這樣的錯誤不是很理解,希望看到的大神可以多多指點,這個錯誤StackOverflow上目前也沒有看到解決的答案。我這個解決方法只是在我這裡有效,讀者那裡目前我不能肯定。
8.Exception raised during rendering: com/android/util/PropertiesMap
現象:xml預覽不能顯示,由於SDK版本與佈局載入器不相容導致的問題。 解決方法:調整顯示版本
9.org.gradle.process.internal.ExecException: Process 'command 'D:\MyFile\androidstudio\sdk\build-tools\23.0.3\aapt.exe'' finished with non-zero exit value 1
解決方法:Build----clean專案
10.開發需求:解決軟鍵盤遮蓋問題
在進入頁面的時候,顯示搜尋框、地圖和當前定位返回的引數填充的listview,當點選搜尋框時,軟鍵盤彈出會蓋住listview。
解決思路:在佈局中對地圖和listview巢狀上scollview,同時監聽軟鍵盤的彈出隱藏,當鍵盤彈出的時候,scollview滑動到地圖控制元件的底端,當鍵盤隱藏的時候滑動到頂部
具體程式碼:
private void controlKeyboard(final View root, final View scrollToView) {
root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (root != null && scrollToView != null){
Rect rect = new Rect();
//獲取root(scrollview)在窗體的可視區域
root.getWindowVisibleDisplayFrame(rect);
//獲取root(scrollview)在窗體的不可視區域高度(被其他View遮擋的區域高度)
int rootInvisibleHeight = root.getRootView().getHeight() - rect.bottom;
//若不可視區域高度大於100,則鍵盤顯示
if (rootInvisibleHeight > 100) {
int[] location = new int[2];
company_map.getLocationInWindow(location);
//滾動到地圖控制元件的底部
root.scrollTo(0, company_map.getBottom());
} else {
//鍵盤隱藏。滾動到頂端
root.scrollTo(0, 0);
}
}
}
});
}
11.java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.View.getImportantForAccessibility()' on a null object reference
發生原因:getVIew()沒有返回convertView,粗心大意
12.如何去除NavigationView中menu的滾動條:
<span style="font-size:12px;">private void removeNavigationViewScrollbar(NavigationView navigationView){
if (navigationView != null){
NavigationMenuView navigationMenuView = (NavigationMenuView) navigationView.getChildAt(0);
if (navigationMenuView != null){
navigationMenuView.setVerticalScrollBarEnabled(false);
}
}
}</span>
13.Error:Execution failed for task ':app:buildInfoDebugLoader'.
> Exception while doing past iteration backup : Source D:\ZhangyuBilibili\app\build\intermediates\builds\debug\9872249157511\classes.dex and destination D:\ZhangyuBilibili\app\build\intermediates\builds\debug\9872249157511\classes.dex must be different
解決:刪掉它