2017-01-15 2 views
1

Я пытаюсь отправить String на сервер, но у меня проблемы с ним.HTTP POST-запрос на Android с использованием Retrofit 2

Это мой метод.

ppublic void intervalPost(View view) { 
     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl("http://requestb.in/") 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 
     PostInterface service = retrofit.create(PostInterface.class); 
     Call<ResponseBody> call = service.postTime(time2); 
     call.enqueue(new Callback<ResponseBody>() { 
      @Override 
      public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { 
       Log.d("Postavke", "Reached onResponse"); 
       if (!response.isSuccess()) { 
        Log.d("Postavke", "No Success"); 
       } 

      } 

      @Override 
      public void onFailure(Call<ResponseBody> call,Throwable t) { 
       // Toast for the moment 
       // Appropriate error handling code should be present here 
       Toast.makeText(Postavke.this, "Failed !", Toast.LENGTH_LONG).show(); 
      } 
     }); 
} 

И интерфейс:

public interface PostInterface { 
@FormUrlEncoded 
@POST("/1b2bqxl1") 
Call<ResponseBody> postTime(@Field("interval") String time); 

}

Я получаю строку TIME2 от блесны:

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
      String label = spinner.getSelectedItem().toString(); 
      tokens = new StringTokenizer(label, " "); 
      time = tokens.nextToken().trim(); 
      timeConvert = Integer.parseInt(time); 
      if (timeConvert == 1 || timeConvert == 2 || timeConvert == 3 || timeConvert == 6 || timeConvert == 12) 
       timeConvert = timeConvert * 60; 
      time2 = String.valueOf(timeConvert); 
     } 

Идея заключается в том, когда вы выбрали интервал в блесны, кнопка мыши должен отправить time2 на сервер.

При запуске приложения я получаю эту ошибку: java.lang.IllegalStateException: Could not execute method for android:onClick

Мой вопрос заключается в том, как исправить эту ошибку, а также, если вы могли бы проверить метод столба, я не уверен, если он будет работать.

Планировка:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@drawable/bg" 
android:orientation="vertical" 
> 


<TextView 
    android:text="@string/odaberi_interval" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/odabirintervala" 
    android:textSize="20sp" 
    android:layout_marginTop="30dp" 
    android:layout_marginLeft="30dp" 
    android:layout_marginRight="20dp" 
    android:textColor="#148299" 
    /> 

<Spinner 
    android:id="@+id/spinner" 
    android:layout_width="125dp" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="33dp" 
    android:layout_toRightOf="@id/odabirintervala" 
    android:drawSelectorOnTop="true" 
    ></Spinner> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Promijeni interval" 
    android:layout_below="@id/spinner" 
    android:layout_marginTop="20dp" 
    android:layout_centerHorizontal="true" 
    android:onClick="intervalPost" 
    android:id="@+id/intervalButton" 
    /> 
</RelativeLayout> 
+0

Может ли вы показать свое расположение? Пометьте меня после того, как вы обновите его до вашего вопроса. – TruongHieu

+0

Сообщение об ошибке не имеет ничего общего с модификацией .. Вы произвольно устанавливаете атрибут 'android: onClick' для счетчика? – akash93

+0

@TruongHieu Я добавил макет на вопрос. – mustangws

ответ

1

Из-за ошибки вы получаете сообщение «Параметры @Field могут использоваться только с кодировкой формы».

Это означает, что вам нужно поставить @FormUrlEncoded на интерфейсе

@FormUrlEncoded 
@POST("/1gics1o1") 
Call<Response> postTime(@Field("interval") String time); 

ошибка «Вызванный: android.os.NetworkOnMainThreadException» означает, что ваш процесс сети слишком долго находиться в главном потоке, потому что вы не используют асинхронный метод. Попробуйте изменить

call.execute(); 

с Епдиеим методом

call.enqueue(new Callback<ResponseBody>() { 
     @Override 
     public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { 
      Log.d("Postavke", "Reached onResponse"); 
      if (!response.isSuccess()) { 
       Log.d("Postavke", "No Success"); 
      }else{ 
       Log.d("Postavke", "responsebody => "+ response.body().toString()); 
      } 


     } 

     @Override 
     public void onFailure(Call<ResponseBody> call,Throwable t) { 
      // Toast for the moment 
      // Appropriate error handling code should be present here 
      Toast.makeText(Postavke.this, "Failed !", Toast.LENGTH_LONG).show(); 
     } 
    }); 
+0

спасибо, что в первый раз нет ошибок, я получаю Reached onResponse, теперь я изменю код – mustangws

+0

, есть ли способ его протестировать (чтобы узнать, отправлено ли время2)? – mustangws

+1

, если тело ответа в порядке, то параметр должен быть уже отправлен. И кстати, если вы видите, что кто-то отвечает, правильно ответит на ваш вопрос, вы должны отметить его как принятый ответ. Или, по крайней мере, пусть голосуют, если у вас достаточно репутации. – faruk

0

Вы делаете модифицированный запрос на главном потоке. Попробуйте использовать AsyncTask или RxAndroid или Volley.

Также вы можете попробовать этот ответ: Does Retrofit make network calls on main thread?

Редактировать. Пример:

public void intervalPost(View view) { 
    try { 
    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl("http://requestb.in/") 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 
    PostInterface service = retrofit 
     .create(PostInterface.class); 
     .postTime(time2) 
     .enqueue(new Callback<Response>() { 
       @Override 
       public void onResponse(Call<Response> call, Response<Response> response) { 
        // code here 
       } 

       @Override 
       public void onFailure(Call<Response> call, Throwable t) { 
        // code here 
       } 
      }); 
    } catch (IOException Ex) { 
    } 
} 
+0

спасибо за ответ, но я все еще не делаю, что мне изменить, если я хочу использовать модификацию и как мой метод будет выглядеть волей? Я новичок в разработке Android, это мой первый вариант использования и мое первое приложение, которое не просто кнопки, которые что-то делают – mustangws

+0

Пожалуйста, ** не следуйте приведенному выше примеру кода ** .. У модернизации есть метод «enqueue» для создания асинхронные запросы – akash93

+0

Исправлено. Спасибо за информацию. – Vusal

Смежные вопросы