2015年9月17日 星期四

[Android] 遇到android.os.NetworkOnMainThreadException的解決方法

操作步驟:
1.掃描QR Code取得隱藏在QR Code內的token資料。
2.將token值透過HTTP Post傳至Server端,並取得Server回傳的資料。
3.取得回傳資料後做解析。

問題:
在要取得Server回傳資料時顯示錯誤訊息android.os.NetworkOnMainThreadException

解決方法:
自行新增一個Thread,本次使用的是AsyncTask。

原程式:
public class IndexGivePresentsQRCodeActivity extends Activity {

    ...

    // QR Code傳回結果  
    protected void onActivityResult(int requestCode, int resultCode, Intent intent)
    {
        // ...處理方法...
    
        sendPostDataToInternet();
    
        // ...處理方法...
    }

    private void sendPostDataToInternet()
    {
        // 建立HTTP Post連線
        HttpPost httppost = new HttpPost(getResources().getString(R.string.PhpData));
        // Post運作傳送變數 必需用NameValuePair陣列儲存
        List nameValuePairs = new ArrayList(1);
        // 新增變數(Key,value)
        nameValuePairs.add(new BasicNameValuePair("token", tokenStr));
        try
        {
            // 發送HTTP Request
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs,HTTP.UTF_8));  // 此行會出現錯誤
            // 取得HTTP Respense (Execute HTTP Post Request)
            HttpResponse response = new DefaultHttpClient().execute(httppost);
            // 取得回傳字串
            HttpEntity entity = response.getEntity();
            sendResult = EntityUtils.toString(entity);

            // ...資料處理...
        }
        catch(Exception e)
        {
            //  ...Error處理...
        }
    }

    ...

}

修改後程式:
public class IndexGivePresentsQRCodeActivity extends Activity {

    ...

    // QR Code傳回結果  
    protected void onActivityResult(int requestCode, int resultCode, Intent intent)
    {
        // ...處理方法...
    
        new Connection().execute();
    
        // ...處理方法...
    }

    private class Connection extends AsyncTask
    {
        @Override
        protected Object doInBackground(Object... params) {
            // TODO Auto-generated method stub
            sendPostDataToInternet();
            return null;
        }
    }

    private void sendPostDataToInternet()
    {
        // 建立HTTP Post連線
        HttpPost httppost = new HttpPost(getResources().getString(R.string.PhpData));
        // Post運作傳送變數 必需用NameValuePair陣列儲存
        List nameValuePairs = new ArrayList(1);
        // 新增變數(Key,value)
        nameValuePairs.add(new BasicNameValuePair("token", tokenStr));
        try
        {
            // 發送HTTP Request
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs,HTTP.UTF_8));  // 此行會出現錯誤
            // 取得HTTP Respense (Execute HTTP Post Request)
            HttpResponse response = new DefaultHttpClient().execute(httppost);
            // 取得回傳字串
            HttpEntity entity = response.getEntity();
            sendResult = EntityUtils.toString(entity);

            // ...資料處理...
        }
        catch(Exception e)
        {
            //  ...Error處理...
        }
    }

    ...

}

沒有留言:

張貼留言