1. 程式人生 > >android 開發中遇到錯誤及解決辦法總結(在別處看到的)

android 開發中遇到錯誤及解決辦法總結(在別處看到的)

一、dialog.show()引起的android.view.WindowManager$BadTokenException錯誤

錯誤日誌

android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running?
	at android.view.ViewRootImpl.setView(ViewRootImpl.java:653)
	at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:326)
	at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224)
	at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149)
	at android.view.Window$LocalWindowManager.addView(Window.java:558)
	at android.app.Dialog.show(Dialog.java:316)
錯誤原因
錯誤原因是Dialog在show的時候必須要有一個activity作為視窗載體,上面的日誌的意思是承載Dialog的activity已經被銷燬了,不存在了

解決辦法
1、在show之前加判斷activity是否被銷燬了
if(!isFinishing()){
dialog.show();
}
2、直接try catch(不推薦)
錯誤日誌
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
錯誤原因
先說說上下文的使用
對話方塊它是我們的Activity的一部分,對話方塊它掛載在我們的Activity上;
getApplicationContext()這個方法得到的是Context
Activity.this 得到Context的一個子類
也就是說 Activity.this 相當於是getApplicationContext()的子類
父類有的子類一定有 - 沒有 token
子類有的父類不一定有 --有 token
this 還有Activity.this和我們的getApplicationContext();
大多數情況推薦:Activity.this
解決辦法
上下文大多數情況推薦:Activity.this

二、dialog.dismiss()引起的java.lang.IllegalArgumentException錯誤

錯誤日誌
java.lang.IllegalArgumentException: View not attached to window manager
	at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:383)
	at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:285)
	at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:104)
	at android.app.Dialog.dismissDialog(Dialog.java:332)
	at android.app.Dialog.dismiss(Dialog.java:315)


錯誤原因
這個錯誤測試是測不出來的,我是加了第三方的錯誤統計才得以發現的,原因是由於某種原因導致Activity被殺死後又重新建立
常發生這類Exception的情形都是,有一個費時的執行緒操作,需要在顯示一個ProgressDialog,在任務開始的時候顯示一個對話方塊,然後當任務完成了再Dismiss對話方塊,如果在此期間如果Activity因為某種原因被殺掉且又重新啟動了,那麼當Dismiss的時候WindowManager檢查發現Dialog所屬的Activity已經不存在了,所以會報IllegalArgumentException: View not attached to window manager.
解決辦法
從網上找了好些解決方案都不是太理想,然後就嘗試著自己解決, 我是這麼解決的,反正加上之後這個錯誤就沒有再出現過,如有不對還請賜教。
重寫Activity的onDestroy,將dialog置為空。
@Override
	public void onDestroy() {
		super.onDestroy();
		dialog=null;
	}



三、讀取通訊錄時,使用者選擇拒絕,未能獲取許可權導致的java.lang.SecurityException: Permission Denial錯誤
錯誤日誌
java.lang.SecurityException: Permission Denial: reading com.android.providers.contacts.ContactsProvider2 uri content://com.android.contacts/data/phones from pid=27697, uid=10194 requires android.permission.READ_CONTACTS, or grantUriPermission()
	at android.os.Parcel.readException(Parcel.java:1465)
	at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:185)
	at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137)
	at android.content.ContentProviderProxy.query(ContentProviderNative.java:413)
	at android.content.ContentResolver.query(ContentResolver.java:470)
	at android.content.ContentResolver.query(ContentResolver.java:413)


錯誤原因
讀取通訊錄時,使用者選擇拒絕,未能獲取許可權
解決辦法
直接try catch 如果捕獲到異常,提示使用者未授於許可權。

四、撥打電話時,手機沒有相關應用程式導致的android.content.ActivityNotFoundException錯誤,用瀏覽器開啟網頁連結時,若沒有安裝瀏覽器,也會產生類似的錯誤,解決辦法一樣
錯誤日誌
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.DIAL dat=tel:xxxxxxxxxxxx }
	at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1632)
	at android.app.Instrumentation.execStartActivity(Instrumentation.java:1424)
	at android.app.Activity.startActivityForResult(Activity.java:3438)
	at android.app.Activity.startActivityForResult(Activity.java:3399)


錯誤原因
因為手機沒有安裝可以撥打電話的應用程式
解決辦法
直接try catch 如果捕獲到異常,提示使用者沒有相關的應用程式處理此操作
五、在子執行緒,更新UI
錯誤日誌
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
	at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:5281)
	at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:943)
	at android.view.View.requestLayout(View.java:15614)
	at android.view.View.requestLayout(View.java:15614)


錯誤原因
在子執行緒顯示一個Toast,更新UI只能在主執行緒中進行
解決辦法
1、使用Looper
Looper.prepare();	
	Toast.makeText(aActivity.this,"test",Toast.LENGTH_SHORT).show();
	Looper.loop();


2、使用Handler
在類中定義
private final Handler msgHandler = new Handler(){
        public void handleMessage(Message msg) {
                switch (msg.arg1) {
                case R.string.msg_not_network:
                        Toast.makeText(getApplicationContext(), getResources().getString(R.string.msg_not_network), Toast.LENGTH_SHORT).show();
                        break;
                default:
                        break;
                }
	 }
	};


在子執行緒中,傳送訊息
Message msg = msgHandler.obtainMessage();
	msg.arg1 = R.string.msg_not_network;
	msgHandler.sendMessage(msg);

相關推薦

android 開發遇到錯誤解決辦法總結(在別處看到的)

一、dialog.show()引起的android.view.WindowManager$BadTokenException錯誤錯誤日誌 android.view.WindowManager$BadTokenException: Unable to add window -

Android開發常見問題解決方案

1、介面對接中的關鍵字解析 在日常介面對接中,經常會出現介面返回的資料節點是java中的關鍵字(類似介面返回 extends 節點),會導致解析異常。針對這種情況有以下的解決方案:1、fastjson 解析的情況下可以使用以下註解如:public class DataBean

laravel框架使用錯誤解決辦法總結

auto laravel 輸入 裏的 原因 情況 autoload san 錯誤 1.Laravel訪問出錯錯誤信息:`Warning: require(/vendor/autoload.php):failed to open stream: No such file or

ubuntu環境搭建java開發環境(含遇到的錯誤解決辦法)

一.安裝JDK 方法很多,參考網址http://blog.csdn.net/zth1002/article/details/51383508 即可。 注意這裡,在配置好了環境變數之後,可以不用重啟電腦,可以直接source ~/.bashrc使剛剛的修改直接

在myeclipse使用maven前常見錯誤解決辦法

eclips aam lai loj yate ren err jar ued %E4%BD%BF%E7%94%A8CHttpFile%E4%BB%8E%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AB%AF%E6%AD%A3%E7%A1%AE%E7%9A%

使用python出現的錯誤解決辦法

python【問題1】在編譯安裝完Python後,不能正常使用yum,使用yum出現以下錯誤[[email protected]/* */ bin]# yum File "/usr/bin/yum", line 30 except KeyboardInterrupt, e:

vue遇見的一系列錯誤解決辦法

總結在vue中遇見的一系列錯誤並給出解決方法,持續更新... 在vue檔案中寫了script標籤對而不宣告export default {} 將會報此錯誤,如: <template> </template> <script> &l

第三篇:開發的問題解決方式

.text cat 彈窗 ret 如何 配置 中項 新的 顯示 1.texarea 如何保存空格、換行? 答:var content1= $("#content").val(); var content =content1.replace(/\n|\r\n/g,"&

MySQL錯誤解決方法

chan col pan sql命令 sharp arp 自己的 class word 1. 修改密碼提示 ERROR 1054 (42S22): Unknown column ‘‘password‘‘ in ‘‘field list‘‘ 錯誤原因:mysql數據庫下已

MVC MVC常見錯誤解決辦法

.cn log entity ash cnblogs vid services ron strong MVC常見錯誤及解決辦法 問題1: 必須添加對程序集“EntityFramework, Version=5.0.0.0, Culture=neutral,

java.lang.NumberFormatException 錯誤解決辦法

sys main rgs 方法 cep integer rim parse pack package com.geelou.test; public class ErrTest { public static void main(String[] args

Laravel ajax請求419錯誤解決辦法(CSRF驗證) 阿星小棧

detail meta csdn div content pre bsp setup rip ajax請求報419 unknown status 解決辦法1:將這個接口放到api路由上,這樣可以跳過CSRF的檢查 解決辦法2: 1.在頁面上添加 <meta nam

Android開發XRecyclerview用法遇到的一些問題

解決 pos sage head ebe 專業 剛才 adapt 只需要 目前通過xrecyclerview的開源代碼來實現系列功能,加載數據傳入type,值為1,2,3,分別表示初次加載,下拉刷新數據,上拉加載更多數據操作,刷新數據只需要重新放入數據,然後notifyDa

vue在html出現{{}}原因解決辦法

在剛開始接觸vue的時候,我們都是直接用<script>引入vue.js使用。沒有藉助vue-cli腳手架來構建專案。 對於一個初學者來說,跟著文件慢慢搬磚,使用vue進行資料繫結。 記得在最開始使用vue寫公司專案的時候,在頁面初始化化是,THML會閃現出{{}},當時測試問我有沒有解決辦法

Python使用requirements.txt安裝類庫錯誤解決辦法

1、Python使用requirements.txt安裝類庫 出現錯誤 pip install -r requirements.txt “No such file or directory: ‘requirements.txt’” 解決辦法:cd 到這個檔案下,再執行命令。 2、出

Nginx常見錯誤解決辦法

1、Nginx 常見啟動錯誤  有的時候初次安裝nginx的時候會報這樣的錯誤  sbin/nginx -c conf/nginx.conf  報錯內容:sbin/nginx: error while&nbs

loadrunner的幾種常見錯誤解決辦法

1、錄製loadrunner指令碼時,無法生成指令碼,錄製過程中事物都有顯示,我把所有防火牆和網路保護都關了,但是指令碼就是無法生成,協議之類的都是對的。  解決: 在錄製選項option->network->     ort Map

編寫shell時,遇到let: not found錯誤解決辦法

#!/bin/bash i=1 sum=0 while [ $i -le 100 ] do   let sum=sum+$i   let i++ done 在寫一個簡單的迴圈指令碼時,報錯 let: not found,在ubuntu預設是指向bin/dash直譯器的,das

mysql-所問題解決辦法

1.1366錯誤 導致1366錯誤的原因是:資料庫此欄位的字符集與整理字符集不同。 只需要將資料庫的字符集、表的字符集、各欄位的字符集調整設為相同即可。 通過 show full columns from 表名 可以檢視各欄位的字元 通過 show full columns from

使用ffmpeg庫編譯錯誤解決辦法

一、FFmpeg原始碼下載與編譯 # wget http://www.ffmpeg.org/releases/ffmpeg-0.5.13.tar.bz2 # tar -jxvf ffmpeg-0.5.13.tar.bz2 # vim ffmpeg_configure.sh .