【发布时间】:2017-12-29 23:11:14
【问题描述】:
首先,我有 2 个片段,它们显示不同的 json 值(2 个链接)。如果我更改片段(.replace()),该片段会通过改造获得值并显示它。它工作得很好,但其他片段被删除了值。更改片段后,它会再次下载,因此我更改了结构。我想一次获取 2 个 json 对象,因此我在 mainactivity 中获取 json 对象,片段通过方法获取这些对象。它们在第一次打开时运行良好,但如果我第二次打开片段,则会出现此错误。我该如何解决?
java.lang.IllegalStateException: Already executed.
at retrofit2.OkHttpCall.enqueue(OkHttpCall.java:84)
代码很长,我会展示主要结构。
MainActivity.java
public class MainActivity extends AppCompatActivity
{
private Call<Restaurant[]> restaurantCall;
private Call<Dining[]> diningCall;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Restaurant Json value
RestaurantInterface restaurantInterface = RetroClient.getClient().create(RestaurantInterface.class);
restaurantCall = restaurantInterface.getJsonValues();
//Dininghall Json value
DiningInterface diningInterface = RetroClient.getClient().create(DiningInterface.class);
diningCall = diningInterface.getJsonValues();
}
public Call<Restaurant[]> RestaurantJson()
{
return this.restaurantCall;
}
public Call<Dining[]> DiningJson()
{
return this.diningCall;
}
}
RestaurantFragment.java(其他片段结构相同)
public class RestFragment extends Fragment
{
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.fragment_rest, container, false);
Call<Restaurant[]> call = ((MainActivity) getActivity()).RestaurantJson();
call.enqueue(new Callback<Restaurant[]>()
{
.
.
【问题讨论】:
-
看看这个stackoverflow.com/a/35094488/3172725。您不能两次使用同一个呼叫,您需要克隆您的呼叫。
-
我检查过了,但是我如何使用 clone() 呢?
-
Call<Restaurant[]> retryCall = call.clone();retryCall.enqueue(new Callback<Restaurant[]>()... 或public Call<Restaurant[]> RestaurantJson() { return this.restaurantCall.clone(); } -
谢谢,它成功了。我确实返回了 this.restaurantCall.clone();并返回 this.diningCall.clone();但是,我认为它会在主要活动中下载 json 对象,但它会以片段的形式下载它们。为什么以及解决方案是什么?
-
为方便起见,我回复了这个新问题的答案...评论太长了
标签: android android-fragments retrofit retrofit2 android-fragmentactivity