【问题标题】:setText("test") is freezing UIsetText("test") 正在冻结 UI
【发布时间】:2013-01-20 13:15:44
【问题描述】:

我不明白

我有一个后台线程,它获取 cpu 负载,然后将其设置为文本视图

问题是当 setText() 方法被执行时 UI 冻结了一秒钟,当滚动浏览 ui 的其他元素时我能感觉到它

Runnable runnable = new Runnable() {
        @Override
        public void run() {
            while(thread) {
                try {
                    RandomAccessFile reader = new RandomAccessFile("/proc/stat", "r");
                    String load = reader.readLine();

                    String[] toks = load.split(" ");

                    long idle1 = Long.parseLong(toks[5]);
                    long cpu1 = Long.parseLong(toks[2]) + Long.parseLong(toks[3]) + Long.parseLong(toks[4])
                        + Long.parseLong(toks[6]) + Long.parseLong(toks[7]) + Long.parseLong(toks[8]);

                    try {
                        Thread.sleep(360);
                    } catch (Exception e) {
                        }

                    reader.seek(0);
                    load = reader.readLine();
                    reader.close();

                    toks = load.split(" ");

                    long idle2 = Long.parseLong(toks[5]);
                    long cpu2 = Long.parseLong(toks[2]) + Long.parseLong(toks[3]) + Long.parseLong(toks[4])
                        + Long.parseLong(toks[6]) + Long.parseLong(toks[7]) + Long.parseLong(toks[8]);

                    fLoad =  (float)(cpu2 - cpu1) / ((cpu2 + idle2) - (cpu1 + idle1));

                } catch (IOException ex) {
                        }
                final int load =(int) (fLoad*100);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                }
                mHandler.post(new Runnable() {
                        @Override
                        public void run() {

                            setCpuLoad(load);
                        }
                    });
            }
        }
    };
    new Thread(runnable).start();
}

.

 private final void setCpuLoad(int load){
    cpuLoad.setProgress(load);
    cpuLoadTxt.setText(load+"%");
}

我尝试了很多东西,最终发现问题出在 setText() 中,因为当我评论它时 UI 很流畅

【问题讨论】:

  • 什么是 cpuLoadTxt?标签、文本字段等?
  • mHandler 是否有可能不是 UI 线程循环器上的处理程序?
  • 它看起来像android的setText需要一个字符序列而不是一个字符串,所以尝试将你的字符串转换为一个字符序列,然后在setText方法中使用它
  • 用户界面有多复杂?更改 TextView,尤其是当大小为 wrap_content 时,可能会导致整个视图层次结构重新排列,如果您有很多布局和视图,这可能会很慢。

标签: java android


【解决方案1】:

Checkout 在哪个线程中创建 Handler。 您应该在主 (UI) 线程上执行此操作。

【讨论】:

  • 直接在课堂上。它应该在 onCreate 中吗?
  • 但是,如果您确定它会使用主线程 Lopper,您可以随意在任何地方进行操作
  • 在设置文本之前使用断点并在 Eclipse 中使用调试视图...或其他 IDE(如果它有 android 调试器)
猜你喜欢
  • 2021-01-28
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 2015-01-16
  • 2019-09-16
  • 1970-01-01
相关资源
最近更新 更多