2016-08-19 12 views
0

私は、サーバーからJSONArrays/JSONObjectsを取得し、それらを解析し、コールバック関数に渡される特定のオブジェクトを作成するために、非同期コールバックでokhttp3を使用しています。 ほとんどのコールバックコードはすべてのメソッドで同じですが、異なるコード行があります。 異なるオブジェクトに対して同じコードを何度も何度も書く必要がないように、コード行を減らすために使用できるパターンはありますか? 方法ごとに異なるコード行をマークしました。 私が持っている問題は、スイッチ/ケースを使用せずにコールバックオブジェクトを変更することなく、特定のJSON解析関数を呼び出すことです。コールバック重複コード

//-----------------------differs------------------------- 
public void getUser(final HTTPResponseCallback<User> callback) 
{ 
    //-----------------------differs------------------------- 
    final String url = domain + USERS; 
    //------------------------------------------------------- 

    okHttpClient.newCall(buildRequest(url)).enqueue(new Callback() 
    { 
     Handler handler = new Handler(Looper.getMainLooper()); 

     @Override 
     public void onFailure(Call call, IOException e) 
     { 
      handler.post(new Runnable() 
      { 
       @Override 
       public void run() 
       { 
        callback.onFailure(); 
       } 
      }); 
     } 

     @Override 
     public void onResponse(Call call, final Response response) throws IOException 
     { 
      if (response.isSuccessful()) 
      { 
       try 
       { 
        String responseBody = response.body().string(); 

        //-----------------------differs------------------------- 
        JSONObject jsonResponse = new JSONObject(responseBody); 
        final User user = JsonParser.parseUser(jsonResponse 
        //------------------------------------------------------ 

        handler.post(new Runnable() 
        { 
         @Override 
         public void run() 
         { 
          //---------------------------------------last parameter differs---------------------------------------------- 
          callback.onSuccess(new HTTPTransaction(response.code(), response.message(), response.header("ETag")), user); 
          //----------------------------------------------------------------------------------------------------------- 
         } 
        }); 

       } 
       catch (JSONException e) 
       { 
        ... 
       } 
      } 
      else 
       ... 

     } 
    } 
} 

答えて

1

1)異なるタイプの缶のよう<T>とパラメータ化で行った:

interface Worker { 
    T run(String responseBody); 
} 

public <T> void getUser(final HTTPResponseCallback<T> callback, Worker worker) { ... 

3:

public class CallBackWrapper<T> { 
    ... 
    public void getUser(final HTTPResponseCallback<T> callback) { ... 

2)タイプTのインスタンスが返される一意の部品のためのコールバックオブジェクトを紹介)必要な作業者を呼び出す:

   String responseBody = response.body().string(); 

       //-----------------------differs------------------------- 
       final T obj = worker.run(responseBody); 
       //------------------------------------------------------ 

       handler.post(new Runnable() 
       { 
        @Override 
        public void run() 
        { 
         //---------------------------------------last parameter differs---------------------------------------------- 
         callback.onSuccess(new HTTPTransaction(response.code(), response.message(), response.header("ETag")), obj); 
         //----------------------------------------------------------------------------------------------------------- 
        } 
       }); 
+0

run(String responseBody)の代わりにT run(String responseBody)を実行し、CallBackWrapperを使用する必要はありませんでした。しかし、そうでなければ、私は偉大で正確に働いています。ありがとうございました。 – Venjirai

+0

@Venjiraiはい、確かにあなたは正しいです - それは私の誤植でした。 – Andremoniy