gpt4 book ai didi

java - 通过 TimerTask 从另一个类更新 Activity 的 TextView 的两个选项

转载 作者:行者123 更新时间:2023-12-01 22:44:36 25 4
gpt4 key购买 nike

首先感谢您所做的出色工作。论坛一直对我很有帮助,但这次我需要问一个具体的问题。

我创建了一个任务类,它将在 BatteryStatus Activity 中每秒更新一个 TextView 。我发现有两个选项可以更新文本:

  1. 传递对 Context 接口(interface)的引用
  2. 在 Activity 类中创建 getter 函数

对于解决方案 1,我收到此错误:

09-30 20:08:29.635: W/System.err(14515): android.view.ViewRoot$CalledFromWrongThreadException:      Only the original thread that created a view hierarchy can touch its views.

对于解决方案 2,会出现此错误:

09-30 21:23:07.110: W/System.err(16344): java.lang.NullPointerException
09-30 21:23:07.110: W/System.err(16344): at android.app.Activity.findViewById(Activity.java:1653)

好吧,程序不知道这个 TextView 在哪里、是什么。我需要改变什么才能让它发挥作用?我真的很想了解在另一个类中更新 TextViews、Buttons...的两种方法。

  1. 传递对 Context 接口(interface)的引用:

    public class BatteryStatus extends Activity{

    private static Timer myclock;
    private static TimerTask mytask;
    TextView tvBatteryStatus;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_battery_status); // XML-Datei im Layout - Ordner

    // Text View
    tvBatteryStatus = (TextView) findViewById(R.id.tvBatteryStatus);

    // Timer Task
    myclock = new Timer();
    mytask = new Tasks(BatteryStatus.this);
    // schedule the task to run every 1000ms and delay execution for another 1000ms
    myclock.scheduleAtFixedRate(mytask, 1000, 1000);

    }
    }

    任务

    public class Tasks extends TimerTask  {

    Context context;

    public Tasks(Context context){this.context = context;}

    public void run(){
    try{Update();}
    catch(Exception e){e.printStackTrace();}
    }

    public void Update(){
    TextView txtView = (TextView) ((BatteryStatus)context).findViewById(R.id.tvBatteryStatus);
    txtView.setText("Hello");
    }

    }
  2. 在 Activity 类中创建 getter 函数

带 getter 的电池状态

    public class BatteryStatus extends Activity{

private static Timer myclock;
private static TimerTask mytask;
TextView tvBatteryStatus;

@Override
protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_battery_status); // XML-Datei im Layout - Ordner

// Text View
tvBatteryStatus = (TextView) findViewById(R.id.tvBatteryStatus);

// Timer Task
myclock = new Timer();
mytask = new Tasks();
// schedule the task to run every 1000ms and delay execution for another 1000ms
myclock.scheduleAtFixedRate(mytask, 1000, 1000);

}

public TextView getTextView(){
TextView tV = (TextView)findViewById(R.id.tvBatteryStatus);
return tV;
}

}

任务

    public class Tasks extends TimerTask  {

TextView t;
BatteryStatus b = new BatteryStatus();

public void run(){
try{Update();}
catch(Exception e){e.printStackTrace();}
}

public void Update(){
t = b.getTextView();
t.setText("hellooo");
}

}

最佳答案

android 中的基本经验规则是你只能在主线程上更新 View ,因此你会得到异常

 09-30 20:08:29.635: W/System.err(14515): android.view.ViewRoot$CalledFromWrongThreadException:      Only the original thread that created a view hierarchy can touch its views.

这表明您正在从非 UI 线程访问 View 元素。因此,为了从非 UI 线程更改 View ,请参阅此网站并阅读线程部分。这就是你所需要的.. http://developer.android.com/guide/components/processes-and-threads.html

关于java - 通过 TimerTask 从另一个类更新 Activity 的 TextView 的两个选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25556668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com