Android setText在线程中不起作用

Android setText在线程中不起作用,android,multithreading,Android,Multithreading,您好,我有这段代码来修改文本视图,但它一直告诉我:只有创建视图层次结构的原始线程才能接触其视图。 这是我的密码: public void Simulation() { ambientTemp = 20; engTemp = 20; mileage = 123456; fuel = 100; thread = new Thread() { menu1_Fragment f1 = new menu1_Fragment();

您好,我有这段代码来修改文本视图,但它一直告诉我:只有创建视图层次结构的原始线程才能接触其视图。 这是我的密码:

public void Simulation()
{
    ambientTemp = 20;
    engTemp = 20;
    mileage = 123456;
    fuel = 100;

    thread = new Thread()
    {
        menu1_Fragment f1 = new menu1_Fragment();
        menu2_Fragment f2 = new menu2_Fragment();
        menu3_Fragment f3 = new menu3_Fragment();

        public void run()
        {
            for (int i=0; i<l; i++)
            {
                try {
                    Thread.sleep(99);
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }



                speed = SPEED[i];
                revs = ENGSPEED[i];
                System.out.println(speed);
                System.out.println(revs);
                    fuel -= 1;
                    System.out.println(fuel);
                    engTemp += 0.5;
                    System.out.println(engTemp);
                    mileage += 1;
                    System.out.println(mileage);

                    ...
                    View item2 = findViewById(R.id.milage);
                   // f1.setMileage(item2,mileage);
                    View item3 = findViewById(R.id.ambienttemp);
                    f1.setAmbientTemp(item3,ambientTemp);
                    View item4 = findViewById(R.id.gear);
                    f1.setGear(item4,gear);
                    transaction.replace(R.id.container, f1);
                    transaction.commit();
                }
public void Simulation()
{
环境温度=20;
英语温度=20;
里程=123456;
燃料=100;
线程=新线程()
{
menu1_片段f1=新menu1_片段();
menu2_片段f2=新的menu2_片段();
menu3_片段f3=新menu3_片段();
公开募捐
{

对于(inti=0;i将所有与视图相关的代码放在ui线程中

     runOnUiThread(new Runnable() {
        @Override
        public void run() {
                      View item2 = findViewById(R.id.milage);
               // f1.setMileage(item2,mileage);
                View item3 = findViewById(R.id.ambienttemp);
                f1.setAmbientTemp(item3,ambientTemp);
                View item4 = findViewById(R.id.gear);
                f1.setGear(item4,gear);
                transaction.replace(R.id.container, f1);
                transaction.commit();

        }
    });
您的应用程序必须创建其他线程,并将长时间运行的工作放在非UI线程上。有关于如何创建备用线程的选项。您可以创建和启动自己的java.lang.Thread。您可以创建和启动AsyncTask-Android自己的线程简化机制。然后,非UI线程处理长时间运行当用户界面线程坚持显示用户界面并对用户事件做出反应时,用户界面处理(如下载文件),生活似乎又好起来了

但是,paradise中存在一个问题。不幸的是,非UI线程无法更新用户界面(UI)。例如,成功下载文件后,一个单独的(非UI)线程无法显示AlertDialog、更新TextView小部件,否则进行UI更改以指示文件已成功下载。如果尝试从非UI线程更新UI,应用程序将编译,但从非UI线程尝试进行UI更改时引发CalledFromErrorThreadException。异常消息将告诉您,“只有创建视图层次结构的原始线程才能接触其视图。”


为了便于参考,请单击此链接

在SO中不鼓励只回答代码。请解释他的问题是什么。感谢提醒。我在参考网站上添加了几段解释:)好的,我知道了,但现在logcat告诉我调用replace()的空指针问题函数可能我必须在线程内声明事务…对吗?很难说,因为代码不完整。但是可以尝试在ui线程内声明事务。也可以尝试在ui线程menu1_片段f1=new menu1_片段()中包含以下代码;menu2_片段f2=新menu2_片段();menu3_片段f3=新menu3_片段();