使用Toast的注意項

2021-09-25 14:39:46 字數 1632 閱讀 5108

在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等時間格式,注意時區問題,注意設定資料...