首页 > 解决方案 > 处理程序更新片段中的 UI 滞后?

问题描述

我正在制作一个应用程序,在我的应用程序中,我有一种货币 bunz,它会根据玩家购买的内容不断更新。我制作了一个片段,将其放入每个活动中以跟踪 bunz,并创建了一个单例类 Bunz,用于跟踪玩家拥有多少个 bunz。我的片段代码如下所示:

package com.example.bunzclicker;


import android.os.Bundle;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import com.example.bunzclicker.bunz.Bunz;

import java.math.BigDecimal;
import java.util.Timer;
import java.util.TimerTask;

public class fragment1 extends Fragment {
    private TextView bunz_count;
    private TextView money_count;
    private Bunz bunz;
    private Handler handler;
    int delay = 1000;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        bunz = Bunz.getInstance();
        handler = new Handler();
        final View view = inflater.inflate(R.layout.fragment1, container, false);


        handler.postDelayed(new Runnable(){
            public void run(){
                update(view);
                handler.postDelayed(this, delay);
            }
        }, delay);



        return view;
    }
    public void update(View view){
        bunz_count = (TextView) view.findViewById(R.id.final_bunz_count);
        money_count = (TextView) view.findViewById(R.id.final_money_count);
        //System.out.println(bunz.getBaker1());


        TextView bunzCount = (TextView) (view.findViewById(R.id.final_bunz_count));
        BigDecimal number = bunz.getBunz().add((BigDecimal.valueOf
                (bunz.getBaker1()).multiply(BigDecimal.valueOf(.1)))
        ).add((BigDecimal.valueOf(bunz.getBaker2()).multiply(BigDecimal.valueOf(.2)))).
                add((BigDecimal.valueOf
                        (bunz.getBaker3()).multiply(BigDecimal.valueOf(.4)))).
                add((BigDecimal.valueOf
                        (bunz.getBaker4()).multiply(BigDecimal.valueOf(.8)))).
                add((BigDecimal.valueOf(bunz.getBaker5()).multiply(BigDecimal.valueOf(1)))).
                add((BigDecimal.valueOf(bunz.getBaker6()).multiply(BigDecimal.valueOf(2)))).
                add((BigDecimal.valueOf(bunz.getBaker7()).multiply(BigDecimal.valueOf(4)))).
                add((BigDecimal.valueOf(bunz.getBaker8()).multiply(BigDecimal.valueOf(5)))).
                add((BigDecimal.valueOf(bunz.getBaker9()).multiply(BigDecimal.valueOf(10))));
        System.out.println(number);
        bunz.setBunz(number);
        System.out.println(bunz.getBunz());
        bunzCount.setText("Bunz: " + bunz.getBunz());
        money_count.setText("Money: " + bunz.getMoney());
    }
}

问题是更新 UI 有一些滞后,这会导致问题。我怎样才能解决这个问题?

标签: javaandroidandroid-fragments

解决方案


这里的问题是你有两个handlers,一个在另一个里面..你不能那样做..

你可以的是在处理程序内部调用Thread.sleep(long millis);,参数是延迟......

例子:

 handler.postDelayed(new Runnable(){
            public void run(){
                update(view);
                Thread.sleep(delay);
            }
        }, delay);

希望它有效


推荐阅读