2017-06-21 60 views
-5

私はアンドロイドアプリで同期表示したいログインビューを持っています。つまり、ユーザーは、ログイン・レスト・コールが完了するまで、そのページに留まることを望みます。失敗した場合、ユーザーは自分のIDとパスワードを再入力できます。成功した場合は、ウェルカムページにルーティングされます。AndroidでRetrofitを使用して同期呼び出しを行う方法

Retrofitは、同期呼び出しを行う方法の例を示します。しかし、「同期リクエストがAndroid 4.0以降でアプリクラッシュを引き起こす」という警告が表示されます。NetworkOnMainThreadExceptionエラーが発生します。私は、OttoとRobospiceの使用を含むstackoverflowでのさまざまな反応を見てきました。他のユーザーは、自社のリスナーなどを使用して同期要求を使用します。

この機能を実装する最も簡単で安全な方法は何でしょうか。

答えて

-3

あなたはこれを達成するために同期要求を必要としません。..

同期要求は、メインスレッド上で行われています。アンドロイドでは、メインスレッドはUIを描画するために使用されるため、そのスレッドでネットワークリクエストを実行するとUIがブロックされるため、Androidでは例外が発生します。

非同期要求は別のスレッドでネットワークを実行し、のコールバックをメインスレッドに戻します。これがあなたが必要とするものです。

はここでレトロフィットを使用したサンプル・コードは、あなたの場合、私が現在やっているものだ

call.enqueue(new Callback<LoginResponse>() { 
    @Override 
    public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) { 
     if (response.isSuccessful()) { 
      // status code 2xx. start welcome activity 
     } else { 
      // Recieved a response but not 2xx. 
      // Possibly authentication error. Show error message 

     } 
    } 

    @Override 
    public void onFailure(Call<LoginResponse> call, Throwable t) { 
     // request could not be executed (possibly no internet connection) 

    } 
} 
+0

で次のようになります。質問は結果を私の呼び出し断片に戻す方法です。私はフラグメントのインスタンスを渡すことができましたが、フラグメントがなくなる可能性があるため、これは最善の方法ではないようです。または、私はOttoやRobospiceのようなものを使うことができましたが、それは過剰なもののようです。また、ログイン画面で、認証が進行中であるため、離れて移動しないような表現をしたいと思います。 – user6627139

+0

これは 'onResponse'のためのものです。あなたの呼び出しアクティビティ/フラグメントに応答を送ります。 'enqueue'呼び出しの前に不確定な' ProgressBar'を表示し、 'onResponse'ブロックで非表示にすることができます – akash93

+0

ええ、私はそれをすべて取得します。私が言ったように、それは私が現在やっていることです。私は別のクラス(テスト、再利用など)にログイン休憩リクエストを入れたいと思っていました。フラグメントやアクティビティではなく、自分の応答を送信したり取得したりするロジックがすべて関連付けられていました。その後、フラグメントが私のレストサービスクラスのメソッドを呼び出し、完了時に通知されます。 – user6627139

関連する問題