問題描述:在接游戲sdk的時候,由於游戲要求購買的時候是在主線程里面進行的,但是發http請求是不能在主線程里面發,否則就會出現android.os.NetworkOnMainThreadException的異常
解決方法,新開線程
new Thread(){ public void run(){ userInfo= HttpRequest.sendGet(URL, param); Message msg = new Message(); Bundle data = new Bundle(); data.putString("userInfo",userInfo); msg.setData(data); handler.sendMessage(msg); } }.start();
新開線程的時候發現還是拿不到get請求的返回值,原因是線程是並行的,如果在線程外面取get的返回值,有可能get請求線程還沒有執行完就已經開始賦值了
解決方法:
1.使用handler來通知取線程的值
Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); Bundle data = msg.getData(); String userInfo = data.getString("userInfo"); logV(userInfo); userId = parseUserIdFromLoginResult(userInfo); } };
好處是不吃cpu沒有等待
2.設置一個flag,初始化為false,在run里面。get請求線程執行完之后賦值為true,然后在外面循環判斷
while(flag == true){//取值}
這種方法簡單,但是有很嚴重的確定,就是吃cpu,容易卡頓
經驗總結:
在找錯誤的時候,一切依賴logcat,多看日志,有些地方適當設置輸出log.v,要復習線程的用法。。。。。。。。。。。。。。
