java - 处理程序更新片段中的 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 有一些滞后,这会导致问题。我怎样才能解决这个问题?
解决方案
这里的问题是你有两个handlers
,一个在另一个里面..你不能那样做..
你可以做的是在处理程序内部调用Thread.sleep(long millis);
,参数是延迟......
例子:
handler.postDelayed(new Runnable(){
public void run(){
update(view);
Thread.sleep(delay);
}
}, delay);
希望它有效。
推荐阅读
- javascript - 尝试识别转换后的谷歌表单文件,然后将该文件移动到分配文件夹
- c++ - C++20 范围是否支持按功能分组?
- java - 有没有办法将一个对象立即存储到另一个类列表中?
- python - Python:在 for 循环体周围添加语句
- sql - 在 postgres 中不存在
- python - 使用 Paramiko 更改 SFTP 服务器上的目录
- java - 如何使用 jsonrpc4j 客户端将对象作为参数传递?
- image - 这个错误是什么意思以及如何纠正它:图像加载:图像加载失败:E_NETWORK_ERROR
- javascript - 从我的 chrome 扩展后台脚本中,想要检查是否有任何其他 chrome 扩展弹出窗口被聚焦
- amazon-web-services - 如何使用 aws cli 从给定实例 ID 获取 AMI 列表?