【发布时间】:2020-03-30 00:30:31
【问题描述】:
我的 json 对象中有一个设置为布尔值的状态。我的主要问题是,在每次处理的时间让我们说 5 秒,它会添加另一组状态,即显示的先前状态并且没有结束。我不确定是什么触发了这个,任何人都可以帮助我解决这个问题,我刚刚开始学习 android。
【问题讨论】:
标签: java android android-studio retrofit
我的 json 对象中有一个设置为布尔值的状态。我的主要问题是,在每次处理的时间让我们说 5 秒,它会添加另一组状态,即显示的先前状态并且没有结束。我不确定是什么触发了这个,任何人都可以帮助我解决这个问题,我刚刚开始学习 android。
【问题讨论】:
标签: java android android-studio retrofit
在添加任何新内容之前,您需要清除 TextView 的旧内容
//hardware
hardwareStatus.setText("") // Clear old response data from TextView
for (int i = 0; i < response.body().getHardware().length; i++){
// Your logic
}
//software
softwareStatus.setText("") // Clear old response data from TextView
for (int i = 0; i < response.body().getSoftware().length; i++){
// Your logic
}
您看到的是旧结果,因为您附加到结果 TextView
hardwareStatus.append(spannable);
hardwareStatus.append("\n\n");
随便用
hardwareStatus.setText(spannable);
据我了解,如果是这种情况,您将遇到每 5 秒触发一次的 api 调用无限循环 这是因为您在可运行对象中再次调用 postDelayed 函数,如果您要调用端点只需一次然后删除此行
handler.postDelayed(runnable = new Runnable() {
public void run() {
//do your function;
getSystemObject();
handler.postDelayed(runnable, apiDelayed); // Remove this
}
}, apiDelayed);
这里要注意的另一件事是,您应该在
中初始化视图@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
hardwareName = view.findViewById(R.id.hardware_name);
hardwareStatus = view.findViewById(R.id.hardware_status);
softwareName = view.findViewById(R.id.software_name);
softwareStatus = view.findViewById(R.id.software_status);
flagName = view.findViewById(R.id.flagreport_name);
}
此外,您每次调用 api 时都在构建改造实例,最好为改造创建一个单例并调用 create 方法来初始化片段或活动中的全局变量,然后在您的函数中使用此变量,例如这个
// Global variable
private WebApi api = Retrofit.getInstance().create(WebApi.class);
然后在任何函数调用中
api.getNameStatus();
【讨论】:
hardwareStatus.append("\n\n"); 这行代码为我的每个状态提供了一个新行,否则它将水平设置,没有空格
Fragment 不提供 findViewById() 方法。这在Activity 或View 中提供。在实现Fragment 时,您不会在onCreate() 中扩充您的视图(就像您通常在活动中所做的那样。)相反,您在onCreateView() 中执行此操作,并且您需要使用扩充的根视图来查找其中的ID你膨胀的布局。
从onViewCreated 而不是从onResume 调用getSystemObject。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
handler.postDelayed(runnable = new Runnable() {
public void run() {
//do your function;
getSystemObject();
handler.postDelayed(runnable, apiDelayed);
}
}, apiDelayed);
}
【讨论】: