我在onOptionsItemSelected(MenuItem item)方法里要实现每读一条记录延迟3秒对UI界面的EditText进行更新。现在问题是无法实现延迟,直接就把数据库最后一条记录显示在了EditText了,并且编译器不报错。(下面的代码写在onOptionsItemSelected()方法里,我也不知道对不对,但逻辑显示方面我必须把它写在该方法里,因为oncreate()先于onOptionsItemSelected()执行,否则无法实现我要的功能)。我分不多,全给你们了...while(cursor.moveToNext())
{
//no = cursor.getString(0);
recordname=cursor.getString(1);
// StudentsService.image = null;
// StudentsService.classes = cursor.getString(3);
// StudentsService.major = cursor.getString(4);
//new Students(no,name,image,classes,major);

     final Handler myHandler = new Handler()
{
public void handleMessage(Message msg)
{
//如果该消息是本程序所发送的
if (msg.what == 0x1222)
{
studentnum.setText(recordname);//对UI线程的TextView进行更新
    tts.speak(recordname,TextToSpeech.QUEUE_ADD, null);
    System.out.print("ssss"+recordname);
    
}
}
};     
new Timer().schedule(new TimerTask()
{
@SuppressLint({ "HandlerLeak", "HandlerLeak" })
@Override
public void run()
{
//新启动的线程无法访问该Activity里的组件
//所以需要通过Handler发送信息
Message msg = new Message();
msg.what = 0x1222;
//发送消息
myHandler.sendMessage(msg);
}
}, 3*1000);
      
}
cursor.close();

解决方案 »

  1.   

    你这样子开一个线程更新当然有问题咯,你这样子起不到延时显示的效果,因为在两个线程中  recordname=cursor.getString(1);这句话和下面的运行没有先后关系的
      

  2.   

    Handler mDelayedHandler = new Handler();

    while(cursor.moveToNext()){
    String recordname = cursor.getString(1);
    //延时3秒更新一次UI线程
    mDelayedHandler.postDelayed(runnable, 3 * 1000);
    }


    Runnable runnable = new Runnable() {

    @Override
    public void run() {
     studentnum.setText(recordname);//对UI线程的TextView进行更新                                        
     tts.speak(recordname,TextToSpeech.QUEUE_ADD, null);
    }
    };
      

  3.   

    可以读出数据库中的每个记录的学号,但EditText只更新了一次,不明白,为什么???。上面代码做了一点小小改动
    while(cursor.moveToNext())
    {
    no = cursor.getString(0);
    studentnum.setText(no);//对UI线程的TextView进行更新                                        
                 tts.speak(no,TextToSpeech.QUEUE_ADD, null);
    //recordname=cursor.getString(1);
    mDelayedHandler.postDelayed(new Runnable(){
    public void run() {
    // TODO Auto-generated method stub

    }}, 5 * 1000);
    }