在android中toast的使用頻率是很高的,一是系統自帶,二是使用方便,三是可以跨頁面顯示。但是在使用中還是需要注意一些情況,否則可能導致崩潰。
在子執行緒中使用
子執行緒中使用toast是可以的,但是需要先呼叫looper.prepare(),然後再show toast。子執行緒toast參考**。
new thread()
}.start();
連續彈窗
預設情況下連續彈窗的效果是先彈第乙個,再彈第二個,直到所有的都彈窗結束,延遲很大效果不好。解決方法有幾個,
如果toast在顯示則直接settext,不顯示就彈窗。這種方法需要自己加時間戳判斷,因為時間有誤差,有可能導致某些彈窗顯示不了。
先呼叫cancel(),再呼叫show()。因為系統版本的差異,這種方法在有些手機上也會無法顯示。
在第二種的基礎上加一步重新建立的過程,但是記憶體會增加少許,不過不影響。
在android7.1上的問題
由於谷歌的問題,在android7.1上如果ui介面卡頓,show toast會崩潰,具體原因可以參考這個鏈結解決方法是利用反射設定乙個自定義的handler,用try,catch捕獲異常,關鍵**如下
private static void hookn(toast toast) catch (exception ignored)
}
沒有通知許可權
在某些版本的系統上,如果沒有通知許可權,toast也無法顯示了。這個問題有兩種解決方法,一種是在本頁面新增這個toast頁面進行顯示,相當於重寫一遍toast的實現方式,但是這個自定義的無法跨頁面顯示。另外一種方法是利用反射和動態**方式把toast的包名替換為系統包名android,如果toast的packagename是系統包名不會去檢查許可權。關於這一塊兒的原始碼在notificationmanagerservice中,關鍵**如下
private final ibinder mservice = new inotificationmanager.stub() ……}
// 省略
……}
動態修改toast的包名方法如下
private static object inotificationmanagerobj;
/*** hook
* @param toast toast
*/private static void hook(toast toast) , new invocationhandler()
return method.invoke(inotificationmanagerobj, args);
}});
field sservicefiled = toast.class.getdeclaredfield("sservice");
sservicefiled.setaccessible(true);
sservicefiled.set(null, inotificationmanagerproxy);
}} catch (exception e)
}
Toast要注意的地方
乙個小demo,無意間,在子執行緒中toast了一把,竟然報錯了 因為toast在service和activity中都可以執行。所以開始就認為和ui執行緒沒有有太大的關係,而現在子執行緒toast竟然報錯!無奈之下,花了半天的時間看了一下handler,looper,toast的原始碼,終於搞定了。...
Toast的使用詳解
android中提供一種簡單的toast訊息提示框機制,可以在使用者點選了某些按鈕後,提示使用者一些資訊,提示的資訊不能被使用者點選,toast的提示資訊根據使用者設定的顯示時間後自動消失。toast的提示資訊可以在除錯程式的時候方便的顯示某些想顯示的東西,或者給使用者提供友好的介面顯示效果。有兩種...
Mysql使用注意項總結
設計的合理性,能否容忍冗餘字段,盡量一張表,方便開發 考慮使用記錄表,記錄一些查詢和修改的記錄資訊 考慮業務的使用情況,設定相關索引,加速查詢和修改 分庫分表的合理性 儲存量的預估 業務訪問量的預估,是否會造成db的壓力 使用時間戳儲存時間 使用datetime等時間格式,注意時區問題,注意設定資料...