마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

HttpUrlConnection사용 시 NetworkOnMainThreadException 에러

0 추천
package pedaling.new_post_sms;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;

import java.io.IOException;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class MyBroadcastReceiver extends BroadcastReceiver {
    static final String[] ADDRESS = { "11234" };

    private boolean SendTextMessage(final Context context, final String body, final long timestamp, final String address) {
        String data = body;
        String param = "sms=" + data + "&address=" + address + "";

        try {
            URL url = new URL("https://naver.com");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            conn.setRequestMethod("POST");
            conn.setDoInput(true);
            conn.connect();

            OutputStream outs = conn.getOutputStream();
            outs.write(param.getBytes("UTF-8"));
            outs.flush();
            outs.close();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return true;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
            Bundle bundle = intent.getExtras();

            if (bundle != null) {
                Object[] pdusObj = (Object[]) bundle.get("pdus");

                SmsMessage[] messages = new SmsMessage[pdusObj.length];
                for (int i = 0; i < pdusObj.length; i++) {
                    messages[i] = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
                }

                for (SmsMessage currentMessage : messages) {
                    boolean check = false;

                    for (String address : ADDRESS) {
                        if (address.equals(currentMessage.getOriginatingAddress())) {
                            check = true;
                            break;
                        }
                    }

                    if (check) {
                        SendTextMessage(context, currentMessage.getMessageBody(), currentMessage.getTimestampMillis(), currentMessage.getOriginatingAddress());
                    }
                }
            }
        }
    }
}
쓰레드를 사용하면 된다고 하는데 쓰레드 개념을 모릅니다. 어떡하죠?
현재 MainActivity와 위의 파일만 있는데... 쓰레드를 어디에다 만드는지도 모르겠고 어떡하죠?
익명사용자 님이 2017년 9월 14일 질문

1개의 답변

0 추천

아래 처럼 익명 클래스로 스레드를 생성해서 사용하시거나

new Thread(){
    @Override
    public void run() {
        try {
            URL url = new URL("https://naver.com");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            conn.setRequestMethod("POST");
            conn.setDoInput(true);
            conn.connect();

            OutputStream outs = conn.getOutputStream();
            outs.write(param.getBytes("UTF-8"));
            outs.flush();
            outs.close();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}.start();

 

아니면 아래처럼 Thread 클래스를 상속받는 클래스를 하나 만드셔서 사용해야 합니다.

http://tkddlf4209.blog.me/220486989575?Redirect=Log&from=postView

 

이유는 네트워크 관련 클래스의 경우 시간이 오래 걸릴수 있기 때문에 MainThread에서 사용하는 것을 금지하고 있기 때문입니다.

 

MainThread는 UIThread와 같은 것이고 UI 업데이트를 할 때 반드시 메인 쓰레드가 업데이트 해주어야 합니다.

 

시간이 많이 걸리는 작업을 MainThread에서 하게되면 UI 갱신이 필요할 때 작업을 수행하지 못하는 상황이 생기겠죠 ?? 그래서 MainThread가 아닌 Thread에서 작업을 해주어야 하는 겁니당~

Printf (1,380 포인트) 님이 2017년 9월 14일 답변
Printf님이 2017년 9월 14일 수정
...