異常:Can't create handler inside thread that has not called Looper.prepare()解決辦法
阿新 • • 發佈:2019-01-24
近些日。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不接入,偏偏去接入一些不入流的支付。蛋疼!!!