我试图做这个

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    t=new TextView(this); 

    t=(TextView)findViewById(R.id.TextView01); 
    t.setText("Step One: blast egg");

    try {
        Thread.sleep(10000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    t.setText("Step Two: fry egg");

但由于某些原因,仅第二个文本显示了,当我运行。我认为这可能会有事情做的 Thread.sleep() 法阻止。因此可以有人告诉我如何实现一个定时器"异步"?

谢谢。

有帮助吗?

解决方案

我刚刚发布的这个答案Android的讨论Google组

如果你只是想将文本添加到视图,以便显示“步骤一:鸡蛋爆炸第二步:炒鸡蛋”再考虑使用t.appendText("Step Two: fry egg");代替t.setText("Step Two: fry egg");

如果您想彻底改变什么是在TextView以便它说:“第一步:爆蛋”上启动,然后将其“第二步:炒鸡蛋说:”经过一段时间以后,你可以随时使用

可运行例如sadboy给

好运

其他提示

你的 onCreate() 方法有几个巨大缺陷:

1) onCreate 准备 你活性-因此,什么,你在这里做将 可见 要用户,直到这种方法完成!例如,你将永远不能改变 TextView's的文字在这里多 一个 时间仅作为最后一个改变将制订并由此可见的用户!

2)请记住,安卓程序将会默认情况下运行中 一个 螺纹!因此:永远不会使用 Thread.sleep()Thread.wait() 在你的主线是负责你的用户界面!(阅读 "让你的应用程序响应" 进一步的信息!)

什么你的 初始化 你的活动确实是:

  • 没有理由创建一个新的 TextView 对象 t!
  • 你拿起你的布局 TextView 在变 t 以后。
  • 你设置的案文 t (但请记住:它将仅显示 onCreate() 完成和主要事件循环的应用程序的运行!)
  • 你在等待 10秒钟 在你 onCreate 方法-这个 必须永远不会做的 因为它停止所有UI活动和将绝对强制ANR(没有响应,请参阅上面的链接!)
  • 那么你设定的另一个文本,这将是一个显示,一旦你的 onCreate() 方法完成与其他几个 活动生命周期 方法已经处理!

该解决方案:

  1. 设置文本中只有一次 onCreate() -这必须是第一个文本,应该是可见的。

  2. 创建一个 Runnable 和一个 Handler

    private final Runnable mUpdateUITimerTask = new Runnable() {
        public void run() {
            // do whatever you want to change here, like:
            t.setText("Second text to display!");
        }
    };
    private final Handler mHandler = new Handler();
    
  3. 安装这个可运行为的处理程序,在可能的 onCreate() (但是读了我的建议如下):

    // run the mUpdateUITimerTask's run() method in 10 seconds from now
    mHandler.postDelayed(mUpdateUITimerTask, 10 * 1000);
    

建议:可以肯定的你知道 Activity's生命周期的!如果你做这样的东西在 onCreate()这只会发生时你的 Activity 是创造的 第一 时间!机器人将有可能保持你的 Activity 活着为一段较长的时间,即使它不可见的!当用户"开始"一遍-和它仍然是现有的-你不会看到你的第一个文本了!


=>总是安装在处理程序 onResume() 并禁止他们 onPause()!否则你会得到"更新"当你的 Activity 是不见了!在你的情况下,如果你想要看看你的第一个文本时,再次重新激活,你必须将它设置在 onResume(), ,不 onCreate()!

的新文本视图的第一行是不必要的

t=new TextView(this); 

你可以做到这一点。

TextView t = (TextView)findViewById(R.id.TextView01);

据该睡在这一个后台线程是一个例子,但我觉得有一个计时器,将是这更好的。这里是使用定时器,而不是一个很好的例子,一个链接 http://android-developers.blogspot.com/2007/11 /stitch-in-time.html

    Thread thr = new Thread(mTask);
    thr.start();
}

Runnable mTask = new Runnable() {
    public void run() {
        // just sleep for 30 seconds.
                    try {
                        Thread.sleep(3000);
                        runOnUiThread(done);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
        }
    };

    Runnable done = new Runnable() {
        public void run() {
                   // t.setText("done");
            }
        };

@ user264892

我发现,使用一个字符串变量,当我需要与“一个字符串或者前缀”或显式转换为CharSequence中。

因此,而不是:

String Status = "Asking Server...";
txtStatus.setText(Status);

尝试:

String Status = "Asking Server...";
txtStatus.setText((CharSequence) Status);

或:

String Status = "Asking Server...";    
txtStatus.setText("" + Status);

或者,因为你的字符串不是动态的,甚至更好:

txtStatus.setText("AskingServer...");

每你的意见中,我使用手柄和可运行到开关/改变使用“计时器” TextView的的内容。由于某些原因,在运行时,该应用总是跳过第二步骤(“第二步:炒鸡蛋”),并且仅示出了最后一个(第三)步骤(“第三步:服务蛋”)。

TextView t; 
private String sText;

private Handler mHandler = new Handler();

private Runnable mWaitRunnable = new Runnable() {
    public void run() {
        t.setText(sText);
    }
};

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    mMonster = BitmapFactory.decodeResource(getResources(),
            R.drawable.monster1);

    t=new TextView(this); 
    t=(TextView)findViewById(R.id.TextView01); 

    sText = "Step One: unpack egg";
    t.setText(sText);

    sText = "Step Two: fry egg";        
    mHandler.postDelayed(mWaitRunnable, 3000);

    sText = "Step three: serve egg";
    mHandler.postDelayed(mWaitRunnable, 4000);      
    ...
}

:)你用错误的方式线程。 只是执行以下操作:

private void runthread()
{

splashTread = new Thread() {
            @Override
            public void run() {
                try {
                    synchronized(this){

                        //wait 5 sec
                        wait(_splashTime);
                    }

                } catch(InterruptedException e) {}
                finally {
                    //call the handler to set the text
                }
            }
        };

        splashTread.start(); 
}

就是这样。

设置文本到SAM TextView的两倍是覆盖第一个书面文本。 所以第二遍的时候,我们使用的setText我们只是追加像

新的字符串
textview.append("Step Two: fry egg");

@Zordid @Iambda答案是伟大的,但我发现,如果我把

mHandler.postDelayed(mUpdateUITimerTask, 10 * 1000);

在run()方法和

mHandler.postDelayed(mUpdateUITimerTask, 0);

在onCreate方法使事情不断更新。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top