解決發http get請求的時候不成功,出現android.os.NetworkOnMainThreadException的異常


問題描述:在接游戲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,要復習線程的用法。。。。。。。。。。。。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM