[WebView坑]Calling View methods on another thread than the UI thread

問題

最近接搜狗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的支付那裏有什麼直接聯繫,但確實就是這裏改了就好了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章