問題
最近接搜狗sdk,調用支付接口的時候閃退,報錯
java.lang.IllegalStateException: Must be called from main thread of process
於是放到runOnUiThread
中調用
m_context.runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO 搜狗pay
}
});
可以拉起支付了,從支付寶的WebView返回,主Activity跪了,app閃退重啓
報錯如下
java.lang.IllegalStateException: Calling View methods on another thread than the UI thread.
解決辦法
經過各種排查,終於找到了問題所在。
之前因爲接廣告sdk,需要獲取設備的UA
,即WebView User-Agent
。
順便科普下
什麼是UA?
答:UA的全稱是User-Agent,中文名爲用戶代理,是Http請求協議中請求頭的一部分,這裏的請求包括GET請求和POST請求。
UA有什麼作用?
答:在手機端/pc端,可以通過UA來判斷不同的設備,從而可以顯示不同的排版,進而給用戶提供更好的體驗,例如:用手機訪問百度和pc端訪問的頁面排版是不一樣的,這些就是百度根據訪問者的UA來判斷的。
還可通過UA,進行信息統計,主要是用於渠道統計。例如:在app中接入廣告的sdk,當用戶點擊廣告圖片時就需要通過webview進行詳細廣告頁面的跳轉,這時候就需要在webview中進行UA的自定義設置了,這樣後臺廣告平臺的人員就可以通過UA判斷是哪個客戶端(安卓/蘋果),哪個瀏覽器的客戶,進而進行客戶端的統計。
看了下之前獲取UA
封裝的接口是這樣的
@SuppressWarnings("unchecked")
public static String GetWebViewUserAgent(Context ctx) {
String ua = "";
try {
WebView web = new WebView(ctx);
ua = web.getSettings().getUserAgentString();
web.destroy();
}
catch(Exception e) {
Log.e("SDK", "GetWebViewUserAgent Exception");
e.printStackTrace();
}
return ua;
}
上面的寫法已經過時了,在android4.4+
之後,要使用WebSettings.getDefaultUserAgent
接口,如下
@SuppressWarnings("unchecked")
public static String GetWebViewUserAgent(Context ctx) {
String ua = "";
try {
if(Build.VERSION.SDK_INT < 19) {
WebView web = new WebView(ctx);
ua = web.getSettings().getUserAgentString();
web.destroy();
}
else
{
ua = WebSettings.getDefaultUserAgent(ctx);
}
}
catch(Exception e) {
Log.e("SDK", "GetWebViewUserAgent Exception");
e.printStackTrace();
}
return ua;
}
改完之後,就不會閃退了。
雖然不知道這裏獲取UA
和搜狗sdk的支付那裏有什麼直接聯繫,但確實就是這裏改了就好了。