我尝试使用改造在网络通话期间存储来自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。 请帮助....
答案 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>
的异步调用,问题已解决。