2013-02-18 2 views
1

네트워크 작업 (HTTP POST)을 수행하지만 NetworkOnMainThreadException을 보여주는 IntentService가 있습니다. 맞으면 IntentService가 별도의 스레드에서 실행됩니다. 아무도 왜이 예외가 던져 말할 수 있습니까? 내 코드는 다음과 같습니다IntetentService의 NetworkOnMainThreadException

public class UpdateService extends IntentService { 
public static final int UPDATE_PROGRESS = 8344; 
BroadcastReceiver broadcastReceiver; 
public UpdateService() { 
    super("UpdateService"); 
} 
@Override 
protected void onHandleIntent(Intent intent) { 

     if (broadcastReceiver == null) { 

      broadcastReceiver = new BroadcastReceiver() { 

       @Override 
       public void onReceive(Context context, Intent intent) { 

        Bundle extras = intent.getExtras(); 

        NetworkInfo info = (NetworkInfo) extras.getParcelable("networkInfo"); 

        State state = info.getState(); 
        if (state == State.CONNECTED) { 

         onNetworkUp(); 

        } else { 

        } 
       } 
      }; 

      final IntentFilter intentFilter = new IntentFilter(); 
      intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); 
      registerReceiver(broadcastReceiver, intentFilter); 
     } 
} 

@Override 
public void onDestroy(){ 
    unregisterReceiver(broadcastReceiver); 
    } 

void onNetworkUp(){ 
    String aDataRow = ""; 
    try { 
     File myFile = new File(Environment.getExternalStorageDirectory().getPath() + "/myFile.txt"); 
     FileReader fr = new FileReader(myFile); 
     BufferedReader myReader = new BufferedReader(fr); 
     while ((aDataRow = myReader.readLine()) != null) 
     updateLyne(aDataRow); // 
     fr.close(); 
    } catch (Exception e) { 
     Log.e("onNetworkUp",e.toString()); 
    } 


    void updateLyne(String aDataRow){ 
    JSONParser jsonParser = new JSONParser(); 
    String[] words = aDataRow.split(" "); 
    pid = words[1]; 
    String rtime = aDataRow; 
    List<NameValuePair> params = new ArrayList<NameValuePair>(); 
    params.add(new BasicNameValuePair(TAG_PID, pid)); 
    params.add(new BasicNameValuePair(TAG_TIME, rtime)); 

    JSONObject json = null; 
    if (words[0].equalsIgnoreCase("cancel")){ 
     json = jsonParser.makeHttpRequest(url_cancel, "POST", params);     
    } 
    else{ 
     Log.d("empty","file empty!!"); 
    } 

    try { 
     int success = json.getInt("success"); 

     if (success == 1) { 
      delLine(aDataRow); // delete the line 
     } else { 
      Log.d("pid="+pid+" not on board", "failed in deleting"); 
     } 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

} 
} 

JSONParser.java이 문제는

public class JSONParser { 

static InputStream is = null; 
static JSONObject jObj = null; 
static String json = ""; 

// constructor 
public JSONParser() { 

} 

// function get json from url 
public JSONObject makeHttpRequest(String url, String method, 
     List<NameValuePair> params) { 

    // Making HTTP request 
    try { 

     // check for request method 
     if(method == "POST"){ 

      DefaultHttpClient httpClient = new DefaultHttpClient(); 
      HttpPost httpPost = new HttpPost(url); 
      httpPost.setEntity(new UrlEncodedFormEntity(params)); 

      HttpResponse httpResponse = httpClient.execute(httpPost); 
      HttpEntity httpEntity = httpResponse.getEntity(); 
      is = httpEntity.getContent(); 
     } 

    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    try { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       is, "iso-8859-1"), 8); 
     StringBuilder sb = new StringBuilder(); 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
      sb.append(line + "\n"); 
     } 
     is.close(); 
     json = sb.toString(); 
    } catch (Exception e) { 
     Log.e("Buffer Error", "Error converting result " + e.toString()); 
    } 

    // try parse the string to a JSON object 
    try { 
     jObj = new JSONObject(json); 
    } catch (JSONException e) { 
     Log.e("JSON Parser", "Error parsing data " + e.toString()); 
    } 

    // return JSON String 
    return jObj; 

} 
    } 
+0

Android 3.0 이상에서이 코드를 사용하고 계십니까? – Bigflow

+0

@ 빅 플로우. 예 .. ICS에 글을 쓰고 있습니다 .. U가 3.0 이상의 예외를 얻을 것 같아요. – nidhin

+0

예, 맞습니다. sajmon_d의 답변을보십시오. – Bigflow

답변

1

아래에 당신이, 당신은 단지 BroadcastReceiver의 인스턴스를 만들 onHandleIntent()에서 네트워크 요청을 실행하고 등록하지 않을 것입니다 주어진다 그것. 실제 네트워크 요청은 거기에서 실행되지 않습니다. BroadcastReceiver이 UI 스레드에서 발생하는 메시지를 받으면 실행됩니다. 올바른 스키마는 BroadcastReceiver을 다른 곳에 만들고 메시지가 수신되면 을 시작하여 onHandleIntent() 안에 네트워크 호출을 실행합니다. 그러면 실제로는 작업자 스레드에서 실행됩니다. 희망이 도움이됩니다.

+0

탁신 @ 전사 .. 그게 도움이됩니다. 하지만 주 스레드에서 실행중인 활동이 있고이 서비스가 항상 네트워크 상태를 모니터링하는 백그라운드에서 실행되기를 원합니다. 다른 서비스에서'BroadcastReceiver'를 생성하고'IntentService'를 호출하는 것이 가능합니까? 또는 메인 스레드를 사용하지 않고 네트워크 상태를 모니터하는 다른 방법이 있습니까? – nidhin

+0

@nidhin, 연결 상태 모니터링에 대한 좋은 참고 자료는 다음과 같습니다. http://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html 보시다시피, BroadcastReceiver를 모니터링해야합니다 연결성. – Egor

관련 문제