2017-10-23 12 views
0

私はAndroid用クライアント/サーバアプリケーションを作成しています。私には問題があり、それを追跡することはできません。ポイントはこれです: 私はAPIメソッドを持っています。 Retrofit 2を使用して、POST要求をデバイスから送信します(ただし、サーバー上でREQUEST配列を使用するため、メソッドは無関係で、同じGETを使用しようとしました)。メソッドはフォーラムにメッセージを投稿することを前提としています。その結果、2回置かれ、時間は1秒に一致します。私はログからリクエストを受け取り、デバイス上に表示されたユーザーエージェントなどのブラウザから送信すると、すべて正常に動作します.1つの投稿のみが公開されます。Android。クライアント/サーバアプリケーションでは、メッセージがクライアントから投稿されたときに複製されます。

改修方法:

@FormUrlEncoded 
@POST("api/index.php?m=topic&action=send") 
Observable<ApiResponse> sendPost(@Field("id_topic") long id, 
           @Field("subject") String subject, 
           @Field("message") String text); 

メソッドの呼び出し:

public void sendPost(String subj, String text) { 
    Subscription subscription = model.sendPost(args.getLong("topic_id"), subj, 
      text) 
      .subscribe(new Observer<ApiResponse>() { 
       @Override 
       public void onCompleted() { 
       } 

       @Override 
       public void onError(Throwable e) { 
        try { 
         Log.e("Post wrong", "Error while posted message: " + e.getMessage()); 
         activityCallback.makeToast("Message not published, an error occurred"); 
        } catch (NullPointerException e1) { 
         Log.e("Error:", "getMessaage() or activityCallback is null"); 
        } 
       } 

       @Override 
       public void onNext(ApiResponse apiResponse) { 

        try{ 
         activityCallback.makeToast("Message successfully published"); 
        } catch (NullPointerException e) { 
         Log.e("Error:", "activityCallback is null"); 
        } 
        reload(); 
       } 
      }); 
    addSubscription(subscription); 
} 

のonClick:

@OnClick(R.id.sendButton) 
public void send() { 
    if (sendText.getText() == null 
      || sendText.getText().toString().trim().isEmpty()){ 
     makeToast("Введите текст публикации"); 
     return; 
    } 
    presenter.sendPost("Re: Тестовая тема", sendText.getText().toString()); 
} 

onClickのは、正確に1回だけ呼び出されます。見たログでは、要求は一度同じ方法で送信されます。何が問題なの? お願いします。

+0

あなたは 'addSubscription(subscription)'メソッドのコードも投稿できますか? – Schlangguru

+0

私は私の問題を解決しました、ありがとう! –

答えて

0

いつか誰かに役立つかもしれません。私は、ログ内のサーバーの応答を表示するには、このアプリケーションの開発の先頭にコードを書いた:

// Trace serve response 
    clientBuilder.interceptors().add(chain -> { 
     Request request = chain.request(); 
     Response response = chain.proceed(request); 
     Log.i("ServerResponse: ", response.body().string()); 
     return chain.proceed(request); 
    }); 

ここから、コードから分かるように、私は見つけることができませんでした1つの以上の要求を、飛びました今のところすべての方法。私は気配りしていなかった、私は私の問題について考えてみんなに感謝します。

関連する問題