I implement POST request through Retrofit 2 using asynchronous and synchronous method. call.enqueue - executed. call.execute - gives an error: java.lang.IllegalStateException: Could not execute method for android:onClick , etc.

 import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import com.google.gson.Gson; import java.io.IOException; import retrofit.Call; import retrofit.Callback; import retrofit.GsonConverterFactory; import retrofit.Response; import retrofit.Retrofit; public class MainActivity extends AppCompatActivity { private static final String url = "http://mysite.org"; private String respons; private String tokez; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void onClick(View v) throws IOException { // getTokez(); getResponzi(); } public void getTokez() throws IOException { Retrofit retrofit = new Retrofit.Builder() .baseUrl(url) .addConverterFactory(GsonConverterFactory.create()) .build(); RetrofitAPI service = retrofit.create(RetrofitAPI.class); TokenRequest tokenRequest=new TokenRequest(); tokenRequest.setEmail("vasja@gmail.com"); tokenRequest.setPassword("vasja1111"); tokenRequest.setCsrf_login("4bf023fa-879f-4fa5-b64d-594d88c17f84"); tokenRequest.setG_recaptha_response(""); tokenRequest.setRememberMe(1); Call<TokenResponse> call = service.getRequestAccess(tokenRequest); call.enqueue(new Callback<TokenResponse>() { @Override public void onResponse(Response<TokenResponse> response, Retrofit retrofit) { try { int statusCode=response.code(); TokenResponse result = response.body(); respons=new Gson().toJson(result); tokez=result.getAuthTokez(); Log.d("PostTokez","StatusCode="+statusCode); Log.d("PostTokez", "Respons=" + respons); Log.d("PostTokez", "Tokez="+tokez); } catch (Exception e) { Log.d("PostTokez", "There is an error"); e.printStackTrace(); } } @Override public void onFailure(Throwable t) { Log.d("onFailure", t.getMessage()); } }); } //Синхронный запрос public void getResponzi() throws IOException { Retrofit retrofit = new Retrofit.Builder() .baseUrl(url) .addConverterFactory(GsonConverterFactory.create()) .build(); RetrofitAPI service = retrofit.create(RetrofitAPI.class); TokenRequest tokenRequest=new TokenRequest(); tokenRequest.setEmail("vasja@gmail.com"); tokenRequest.setPassword("vasja1111"); tokenRequest.setCsrf_login("4bf023fa-879f-4fa5-b64d-594d88c17f84"); tokenRequest.setG_recaptha_response(""); tokenRequest.setRememberMe(1); Call<TokenResponse> call1 = service.getRequestAccess(tokenRequest); Response response = call1.execute(); } } 

java.lang.IllegalStateException: Could not execute method for android: onClick at android.support.v7.app.AppCompatViewInflater $ DeclaredOnClickListener. at android.view.View $ PerformClick.run (View.java:22259) at android.os.Handler.handleCallback (Handler.java:751) at android.os.Handler.dispatchMessage (Handler.java:95) at android. os.Looper.loop (Looper.java:15)

  • 3
    Attach the code associated with the error, and the gridrate to the question, not a link to an external source. - temq
  • A complete set-up is needed, and not a stub in which there are not even references to your code. - rjhdby

1 answer 1

Response response = call1.execute(); - in the main thread, you cannot perform synchronous calls, because it blocks the main thread

Use asynchronous call via call1.enqueue() and handle the response in callback

Examples

 Call<TokenResponse> call1 = service.getRequestAccess(tokenRequest); call1.enqueue(new Callback<TokenResponse>() { @Override public void onResponse(Call<TokenResponse> call, Response<TokenResponse> response) { if (response.isSuccessful()) { // тут код при успешном ответе // получение ответа TokenResponse response = response.body(); } else { // если не ок то... } } @Override public void onFailure(Call<List<Task>> call, Throwable t) { // обработка fail } }