1. 程式人生 > >異常:Can't create handler inside thread that has not called Looper.prepare()解決辦法

異常:Can't create handler inside thread that has not called Looper.prepare()解決辦法

近些日。cocos2dx遊戲專案要接入一個不主流的支付,達到遊戲內跳轉微信充值,在按照某支付文件寫示例demo的時候各種成功,然而蛋疼的就是移植到遊戲內的時候出現問題。異常就是標題Can't create handler inside thread that has not called Looper.prepare()。


看到翻譯後大概知道了。然後博主就在某支付做引數封裝請求獲取一個toketid之前加上了looper.prepare()這個方法,如下:


最後執行,發現可以跳轉到微信支付也可以成功付款回撥。心想又完成了一個功能了。誰知道高興不過幾小時。測試說有問題。大概就是:在不退出遊戲app的前提下只能支付一次,在次發起支付就卡死,最後anr。

經過除錯發現會爆出下面的一個異常:Only one Looper may be created per thread,大概就是一個主執行緒只能有一個looper。這尼瑪我心想。我就在某支付前加了一個looper那還有其他looper. 難不成是某支付內部封裝的網路請求裡有。。。當時就懵逼了。最後查閱質料和looper相關知識。找到了解決思路:既然某支付封裝的網路請求有可能有一個looper。那我先獲取他主執行緒中的looper,通過它來做一些操作,不用另外looper.prepare().如下:

private Handler mThirdHandler = new Handler(AppActivity.sMyContext.getMainLooper()){
		@Override
		public void handleMessage(android.os.Message msg) {
			super.handleMessage(msg);
			switch (msg.what) {
			case 1:
				
				break;

			default:
				break;
			}
		};
	};

其中APPactivity.sMyContext是當前activity示例。getMainLooper()這個方法就是獲得主執行緒的looper。大家可以去百度這個方法。

最終反覆測試,完美解決。吐槽一句,主流的支付sdk不接入,偏偏去接入一些不入流的支付。蛋疼!!!