【问题标题】:Boolean in Retrofit from a json object来自 json 对象的改造中的布尔值
【发布时间】:2020-03-30 00:30:31
【问题描述】:

我的 json 对象中有一个设置为布尔值的状态。我的主要问题是,在每次处理的时间让我们说 5 秒,它会添加另一组状态,即显示的先前状态并且没有结束。我不确定是什么触发了这个,任何人都可以帮助我解决这个问题,我刚刚开始学习 android。

【问题讨论】:

    标签: java android android-studio retrofit


    【解决方案1】:

    更新 2

    在添加任何新内容之前,您需要清除 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
    }
    

    更新 1

    您看到的是旧结果,因为您附加到结果 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();
    

    【讨论】:

    • 如果我删除那一行,那么我的输出不会每 5 秒更新一次。问题是,在程序执行的每次自动更新中,而不是更新当前文本视图,我将其添加了另一组“状态”。
    • hardwareStatus.append("\n\n"); 这行代码为我的每个状态提供了一个新行,否则它将水平设置,没有空格
    • AND Fragment 不提供 findViewById() 方法。这在ActivityView 中提供。在实现Fragment 时,您不会在onCreate() 中扩充您的视图(就像您通常在活动中所做的那样。)相反,您在onCreateView() 中执行此操作,并且您需要使用扩充的根视图来查找其中的ID你膨胀的布局。
    • @YenBico “它增加了另一组“状态”是什么意思?发生这种情况是完全正常的,因为您正在向 textview 的旧内容添加新的响应,你需要更清楚地说明你需要什么
    • @YenBico 而且我知道 Fragment 类不提供 findViewById() 方法,这就是为什么我使用在 onViewCreated 中传递的视图参数,比如 view.findViewById
    【解决方案2】:

    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);
    }
    

    【讨论】:

    • 如果我删除那一行,那么我的输出不会每 5 秒更新一次。问题是,在程序执行的每次自动更新中,而不是更新当前文本视图,我将其添加了另一组“状态”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 2011-08-13
    • 2010-10-02
    • 2010-11-08
    • 1970-01-01
    • 2020-06-13
    相关资源
    最近更新 更多