2016-09-22 8 views
0
でタイムアウト外部サービスコールを設定する方法

私のシナリオでは、次のコード(単純化)を実行するのonCreate()の活動方法である:のJava/Androidの - ハンドラ

dialog.show(); //loading wheel 
try { 
    remote.sendRequest(myData, new MyHandler()); 
} 
catch (Exception e) { 
    dialog.dismiss(); 
    //log and react  
} 

class MyHandler extends SDKSpecificCompiledHandler { 

    @Override 
    public void failure() { 
     dialog.dismiss(); 
     //do stuff 
    } 

    @override 
    public void success() { 
     dialog.dismiss(); 
     //do stuff 
    } 

} 

//I have read-only access to this handler! 
public abstract class SDKSpecificCompiledHandler { 
    public abstract void success(JSONObject successData); 
    public abstract void failure(JSONObject errorData); 
} 

説明:リモートサービスを渡すと呼ばれています彼が完了したときに呼び出されるハンドラです。ロードホイール(ダイアログ)は、成功、失敗、または例外が発生するまでユーザーに表示されます。

サービスが正常に呼び出されても応答が返されないという問題があります。その場合、dialog.dismiss()は呼び出されず、ローディングホイールは永遠に回転し続けます。

私が必要とするのは、サーバーが戻ってこない場合に、数秒後にダイアログを閉じる(場合によっては他のアクションをとる)種類のタイムアウトです。

私は最初にサービスコール用の新しいスレッドを作成し、起動直後にダイアログを閉じるタイマーを設定しました。 いいアイデアでしょうか?

サービスは、サードパーティ/編集することはできません。

は、

EDIT、ありがとうございました。私はあらかじめコンパイルされたアーティファクトを使用しています。

+1

なぜ、多くのアプリケーションでテストおよび検証、既存のHTTPライブラリを使用していませんか?それはタイムアウトを含むあなたのためのあらゆる種類のHTTP問題を処理します。とにかく、新しいスレッドを作成するのは良い考えではありません。とにかくネットワークコールはワーカースレッド上になければなりません。そのスレッドにハンドラをアタッチし、タイムアウトのケースを処理する遅延メッセージを投稿してください。あなたの呼び出しが遅延メッセージの前に返ってきた場合は、すべてのメッセージなどのハンドラをクリアしてください。 – vkislicins

+0

Vkislincinsにお返事いただきありがとうございます。私が実際にサードパーティのSDKから呼び出しているので、編集ではリクエスト用のhttpライブラリを使用できません。あなたが提案したアプローチを使用するかもしれません。ありがとうございました。 – user2274307

+0

okあなたが使用しているSDKとその 'remote'オブジェクトについてもっと詳しく投稿してください – vkislicins

答えて

0

サービスコール自体でタイムアウトを使用する方が良いです。サービスでタイムアウトを設定できます。タイムアウトを設定する方法がわかっている場合は、使用しているサービスの種類を知っておく必要があります。

さらにもう1つは、ローダーを使用している場合、そのローダーをクライアントが取り消すことができるようにすることです。

+0

こんにちはJoyal、あなたの返事をありがとう。私が使用しているサービスは、編集可能ではない第三者サービスです。私はそれを使用するためにアーティファクトをインポートしています。 – user2274307

+0

にタイムアウトを設定するオプションがある場合は、確認してください。それがない場合は、タイマーを使用してキャンセルする必要があります。 –

0

まだあなたが達成しようとしているものは本当にわからないが、あなたは(つまり、あなたのコードがUIにものを行います)は、メインスレッド上でいくつかの時間後にいくつかのコードを実行したい場合は、あなたがandroid.os.Handler

mHandler = new Handler(getMainLooper()); 
    mHandler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      // do stuff on UI thread 
     } 
    },10000); 
を使用することができます

お電話がサーバから返された場合は、単にキューにメッセージをキャンセルは: - 、、okhttp改造をボレー

mHandler.removeCallbacksAndMessages(null); 
関連する問題