我使用带有异步回调的okhttp3从服务器获取JSONArray/JSONObjects,然后解析它们并创建特定的对象,该对象被传递给回调函数。大多数回调代码对于每个方法都是相同的,但有一些代码行是不同的。有没有一种模式可以用来减少代码行数,这样我就不必为不同的对象一遍又一遍地编写相同的代码?我标记了每种方法不同的代码行。我遇到的问题是在不使用switch/case和改变回调对象的情况下调用特定的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
...
}
}
}
发布于 2016-08-19 10:53:28
1)使用<T>
参数化的Make,因为类型可以不同:
public class CallBackWrapper<T> {
...
public void getUser(final HTTPResponseCallback<T> callback) { ...
2)为唯一分块引入回调对象,返回T
类型的实例
interface Worker {
T run(String responseBody);
}
public <T> void getUser(final HTTPResponseCallback<T> callback, Worker worker) { ...
3)调用需要的worker:
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);
//-----------------------------------------------------------------------------------------------------------
}
});
https://stackoverflow.com/questions/39036954
复制