如何在单例中保持Retrofit onRespose()调用的response.body()数据

时间:2017-03-31 11:26:02

标签: java android singleton retrofit retrofit2

我尝试使用改造在网络通话期间存储来自response.body()的数据。但我无法使用单例对象访问数据。

这是我的单身类代码:

public class FishCategory {
    private SparseArray<String> sparseArray = new SparseArray<>(3);
    private static FishCategory singleton;

    public static FishCategory getSingleton() {
        if (singleton == null) {
            singleton = new FishCategory();
        }
        return singleton;
    }

    public SparseArray<String> getSparse() {
        ApiService service = ApiClient.getClient().create(ApiService.class);
        Call<CategoryResp> call = service.categoryAPI();
        call.enqueue(new Callback<CategoryResp>() {
            @Override
            public void onResponse(Call<CategoryResp> call, Response<CategoryResp> response) {

                CategoryResp categoryResp = response.body();
                for (int i = 0; i < categoryResp.getsData().getCategoryList().size(); i++) {
                    sparseArray.put(i, categoryResp.getsData().getCategoryList().get(i).getCatTitle());
                }
            }

            @Override
            public void onFailure(Call<CategoryResp> call, Throwable t) {

            }
        });
        return sparseArray;
    }
}

现在如果我在另一个类中使用这个单例对象,它将返回null。 请帮助....

2 个答案:

答案 0 :(得分:1)

public SparseArray<String> getSparse() {
        ApiService service = ApiClient.getClient().create(ApiService.class);
        Call<CategoryResp> call = service.categoryAPI();
        call.enqueue(new Callback<CategoryResp>() {
            @Override
            public void onResponse(Call<CategoryResp> call, Response<CategoryResp> response) {

                CategoryResp categoryResp = response.body();
                for (int i = 0; i < categoryResp.getsData().getCategoryList().size(); i++) {
                    sparseArray.put(i, categoryResp.getsData().getCategoryList().get(i).getCatTitle());
                }
            }

            @Override
            public void onFailure(Call<CategoryResp> call, Throwable t) {

            }
        });
        return sparseArray;
    }

在这种情况下,您不是在创建非阻塞编码。使用enqueue,当您的代码仍在执行时,您将其转移到单独的线程,这显然不会等待您的代码执行。所以您的sparseArray是空值。 请使用下面的阻止性质,并注意下面将在主UI线程上工作,这将导致异常。

TaskService taskService = ServiceGenerator.createService(TaskService.class);  
Call<List<Task>> call = taskService.getTasks();  
List<Task>> tasks = call.execute().body();  

请阅读以下内容,了解同步和异步性质。 https://futurestud.io/tutorials/retrofit-synchronous-and-asynchronous-requests

    public SparseArray<String> getSparse() {
            ApiService service = ApiClient.getClient().create(ApiService.class);
            Call<CategoryResp> call = service.categoryAPI();
            call.execute().body();
            for( i = 0; i < categoryResp.getsData().getCategoryList().size(); i++) {
                        sparseArray.put(i, categoryResp.getsData().getCategoryList().get(i).getCatTitle());
            }
            return sparseArray;
        }

答案 1 :(得分:0)

我正在使用Retrofit以及<td class="Label" colspan="1" width="50%"> <input class="Label" type="radio" name="selectedFacilityType" value="1" onClick="document.lending.selectedFacilityTypeValue.value=this.value"> <xsl:if test="facilitytype/options[@id='1']='checked'"> <xsl:attribute name="checked"/> </xsl:if> <!-- start --> <xsl:if test="lettertype/type[@id='personal']='checked'"> <xsl:attribute disabled="disabled"/> </xsl:if> <!-- end --> </input>Overdraft </td> <xsl:choose> <xsl:when test="lettertype/type[@id='personal']='checked'"> <td class="Label" colspan="1" width="50%"> <input class="Label" type="radio" name="selectedFacilityType" value="1" onClick="document.lending.selectedFacilityTypeValue.value=this.value" disabled="disabled"></input>Overdraft </td> </xsl:when> <xsl:otherwise> <td class="Label" colspan="1" width="50%"> <input class="Label" type="radio" name="selectedFacilityType" value="1" onClick="document.lending.selectedFacilityTypeValue.value=this.value"> <xsl:if test="facilitytype/options[@id='1']='checked'"> <xsl:attribute name="checked"/> </xsl:if> </input>Overdraft </td> </xsl:otherwise> </xsl:choose> 的异步调用,问题已解决。