2017-10-22 3 views
-1

OkHttp를 사용하여 게시물 요청을 보내려고하면 휴대 전화 (LG g3)의 앱이 오류없이 중단됩니다.OkHttp를 사용할 때 내 앱이 작동을 멈 춥니 다.

btnSend.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      RequestBody body = RequestBody.create(MediaType.parse("application/x-www-form-urlencoded"), "login=test&pasword=test"); 
      Request request = new Request.Builder() 
        .url("http://myUrl") 
        .post(body) 
        .build(); 
      try { 
       Response response = client.newCall(request).execute(); 

       txtRequest.setText(response.body().string()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 

내가 뭘 잘못하고 있니?

+0

https://stackoverflow.com/.../how-do-i-fix-android-os-networkonmainthreadexception – CommonsWare

+1

나는 안드로이드 스튜디오와 자바에 새로운 해요 당신의 로그 캣 –

답변

0

메인 스레드에서 네트워크 호출을 실행하고 있습니다. 예외는 아닙니다. AsyncTask를 사용하면 문제가 해결됩니다. 여기에 코드의 수정 된 버전이 있습니다. 편집

package com.example.nisu.postrequest; 

import android.os.AsyncTask; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

import java.io.IOException; 

import okhttp3.MediaType; 
import okhttp3.OkHttpClient; 
import okhttp3.Request; 
import okhttp3.RequestBody; 
import okhttp3.Response; 

public class SendPost extends AppCompatActivity { 

    Button btnSend; 
    TextView txtRequest; 
    OkHttpClient client = new OkHttpClient(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_send_post); 

     btnSend = (Button) findViewById(R.id.btnSend); 
     txtRequest = (TextView) findViewById(R.id.txtRequest); 

     btnSend.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       final Request request = new Request.Builder() 
         .url("http://httpbin.org/ip").get() 
         .build(); 
       new MyAsyncTask().execute(request); 
      } 
     }); 
    } 

    class MyAsyncTask extends AsyncTask<Request, Void, Response> { 

     @Override 
     protected Response doInBackground(Request... requests) { 
      Response response = null; 
      try { 
       response = client.newCall(requests[0]).execute(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      return response; 
     } 

     @Override 
     protected void onPostExecute(Response response) { 
      super.onPostExecute(response); 
      try { 
       txtRequest.setText(response.body().string()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

} 
+0

을 게시하시기 바랍니다 ... 그리고 지금, 여러분 모두 코드가 작동하지 않습니다. (비어있는'RequestBody body = RequestBody.create (null, "");'와 함께 http://httpbin.org/ip에 요청을 보내려고했습니다. 내 TextView 여전히 비어있을 것입니다 = ( – NisuSan

+0

당신은이 API에 대한 게시물 요청이 필요하지 않습니다, 그 요청을 얻으려면 단지 전화와 함께. –

+0

그냥 URL을 추가하고 빌드, 그리고 당신은 완료되었습니다 –

관련 문제