2017-01-15 9 views
1

Stringをサーバーに送信しようとしていますが、問題があります。Retrofit 2を使用したAndroidでのHTTP POSTリクエスト

これは私の方法です。

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

を私の質問は、このエラーを修正する方法であり、あなたがPOSTメソッドをチェックすることができる場合も、私はそれがうまくいくかはわかりません。

レイアウト:

<?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

call.execute(); 

を変更しようと、あなたのレイアウトを表示することができますか?あなたの質問に更新した後、私にタグをつけてください。 – 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.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

ありがとうございます。初めてエラーが発生しました、私には届いていますonResponse、今質問 – mustangws

+0

のコードを変更します、それをテストする方法はありますか? – mustangws

+1

レスポンスボディがokの場合、パラメータはすでに送信されている必要があります。ところで、あなたが誰かの答えを見たら、あなたの質問に正しく答えていれば、それを受け入れられた答えとしてマークするべきです。もちろん、あなたが十分な評判を持っていれば、少なくとも投票してください。 – 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

答えがありがたいですが、私はまだ何をしないのですか?私は改造を使いたいと思ったらどうすればいいですか?私はアンドロイドの開発に慣れています、これは私の最初の改造を使用して、何かをするだけのボタンではない私の最初のアプリです – mustangws

+0

**上記のコード例を**従ってはいけません** .. Retrofitは '非同期要求 – akash93

+0

が修正されました。情報ありがとう。 – Vusal

関連する問題