2017-06-23 8 views
0

モデルクラスでネットワークコールがあります。 runOnUIThread私はUIを更新できるようにしたいのですが、UIの何かへの参照を自分のネットワーククラスに渡す必要はありません。ネットワーククラスにUIクラスへの参照を与えずに、RXJavaのようなライブラリを使わずに、UIを更新するにはどうすればいいですか?RXJavaを使用しないOKHTTPネットワークコールのUIを更新しました

ここに私が作業しているコードがあります。

パブリッククラスWeatherNetwork {

public CurrentWeather getDailyWeather(float lat, float lng) { 
    String URL = ""; 
    OkHttpClient client = new OkHttpClient(); 
    Request request = new Request.Builder() 
      .url(URL) 
      .build(); 

    Call call = client.newCall(request); 
    call.enqueue(new Callback() { 
     @Override 
     public void onFailure(Request request, IOException e) { 

     } 

     @Override 
     public void onResponse(Response response) throws IOException { 

      try { 
       String jsonData = response.body().string(); 
       final String passingData = jsonData; 

       if(response.isSuccessful()) { 
        runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 

          }); 
         } 
        }); 
       } 
      } catch(JSONException e) { 
       Log.d(ACTIVITY + " JSONEXCEPTION", e.getMessage()); 
      } catch(IOException e){ 
       Log.d(ACTIVITY + " IOEXCEPTION", e.getMessage()); 
      } 
     } 
    }); 
    return new CurrentWeather(); 
} 

}

+0

イベントバス(例:greenrobotのEventBus)を使用します。あるいは、リアクティブプログラミング手法(例えば、RxJava、Architecture Componentsの「LiveData」)を使用します。 – CommonsWare

+0

ライブラリーでそれをしない方法はありますか? – Rafa

+1

あなたはすでにライブラリ(OkHttp)を使用していますので、なぜあなたがライブラリに反対しているのかはっきりしていません。何らかのコールバックを自分で行うことは大歓迎ですが、間接的にコールバックはUIへの参照を渡します。私はUIの参照を渡しているかどうかについて、どこに線を描いているのか分からない。 – CommonsWare

答えて

1

あなたは、メソッドパラメータとしてCallbackを渡すことができます。

public void getDailyWeather(float lat, float lng, Callback callback) { 

エンキューするとき、それを与えます。

その後
client.newCall(request).enqueue(callback); 
    return; // This method is done now. Make it void 
    // You cannot return from a async method 
} 

、他の場所で、

float lat = 0; 
float lng = 0; 
api.getDailyWeather(lat, lng, new Callback() { 
    @Override 
    public void onFailure(Request request, IOException e) { 

    } 

    @Override 
    public void onResponse(Response response) throws IOException { 

     try { 
      String jsonData = response.body().string(); 
      final String passingData = jsonData; 

      if(response.isSuccessful()) { 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         // This is still necessary 
         // But you can now access Views from your UI class 
        } 
       }); 
      } 
     } catch(JSONException e) { 
      Log.d(ACTIVITY + " JSONEXCEPTION", e.getMessage()); 
     } catch(IOException e){ 
      Log.d(ACTIVITY + " IOEXCEPTION", e.getMessage()); 
     } 
    } 
}); 

あなたがそれをクリーンアップしたい場合は、たとえば

public interface CurrentWeatherCallback { 
    void onWeatherDataReceived(CurrentWeather weather); 
} 

のために、独自のコールバックを定義することができます次に、あなたが持っているものに保ちます他のコールバックを使用する

final CurrentWeather weather = new CurrentWeather(); 
// TODO: Parse JSON 

runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     if (callback != null) callback.onWeatherDataReceived(weather); 
    } 
    }); 

どちらの方法でも、直接UIエレメントへの参照ではなく、インターフェースを渡しています。

関連する問題