首页 文章

如何在计时器内显示吐司?

提问于
浏览
6

我想在计时器中显示toast消息,我使用了以下代码:

timer.scheduleAtFixedRate( new TimerTask()
{       
public void run()
{
    try {  
        fun1();
        } catch (Exception e) {e.printStackTrace(); }            
    }   
}, 0,60000);    

public void fun1()
{
    //want to display toast
}

我收到以下错误:

WARN / System.err(593):java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序WARN / System.err(593):at android.os.Handler . (Handler .java:121)WARN / System.err(593):在android.widget.Toast . (Toast.java:68)WARN / System.err(593):在android.widget.Toast.makeText(Toast.java: 231)

谢谢 .

7 回答

  • 0

    您不能在单独的Thread内部进行UI更新,例如Timer . 您应该使用Handler对象进行UI更新:

    timer.scheduleAtFixedRate( new TimerTask() {
    private Handler updateUI = new Handler(){
    @Override
    public void dispatchMessage(Message msg) {
        super.dispatchMessage(msg);
        fun1();
    }
    };
    public void run() { 
    try {
    updateUI.sendEmptyMessage(0);
    } catch (Exception e) {e.printStackTrace(); }
    }
    }, 0,60000);
    
  • 0

    最简单的方法(IMO)是:

    new Timer().scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            final String message = "Hi";
            MyActivity.this.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(MyActivity.this, message, Toast.LENGTH_SHORT).show();
                }
            });
        }
    });
    

    关键是MyActivity.this.runOnUiThread(Runnable) .

  • 0

    你必须打电话给UIThread来展示Toast . 不是来自计时器线程 .

    else从该计时器线程调用UI线程 .

    这个链接可以帮到你,

    http://developer.android.com/resources/articles/timed-ui-updates.html

    还有这个

    http://developer.android.com/guide/appendix/faq/commontasks.html#threading

    谢谢 .

  • 0

    创建 Handler 并在此显示吐司

    private Handler handler = new Handler() {
            public void handleMessage(android.os.Message msg) {
                // Toast here
            }
        };
    
  • 0

    您需要访问应用程序的上下文才能执行此操作 . 尝试创建自己的类,将上下文作为输入参数:

    private class MyTimerTask extends TimerTask {
        private Context context;
        public MyTimerTask(Context context) {
            this.context = context;
        }
    
        @Override
        public void run() {
            Toast.makeText(context, "Toast text", Toast.LENGTH_SHORT).show();
        }
    
    }
    

    然后在你的计时器:

    timer.scheduleAtFixedRate( new MyTimerTask(this), 0,60000);
    
  • 6

    我想制作一个可以在计时器中显示Toast的简单项目 . Timer将使用服务启动 . 然后,Timer在服务启动时启动,在服务停止时停止 .

    1级

    package com.example.connect;
    
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.os.Handler;
    import android.view.View;
    import android.widget.Button;
    
    public class MainActivity extends Activity {
    
    Button button1,button2;
     private Handler mHandler = new Handler();
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        button1=(Button)findViewById(R.id.button1);
        button2=(Button)findViewById(R.id.button2);
    
    
    }
    
    
    public void Start(View v)
    {
        startService(new Intent(MainActivity.this , Connect_service.class));
    
    }
    
    public void Stop(View v)
    {
        stopService(new Intent(MainActivity.this , Connect_service.class));
    
    }
    
    }
    

    2级

    package com.example.connect;
    
    import java.util.Timer;
    import java.util.TimerTask;
    
    import android.app.Service;
    import android.content.Intent;
    import android.os.IBinder;
    import android.widget.Toast;
    
    public class Connect_service extends Service{
    
    Timer timer = new Timer();
    TimerTask updateProfile = new CustomTimerTask(Connect_service.this);
    
    public void onCreate() {
    
        super.onCreate();
    
        Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT).show();
        timer.scheduleAtFixedRate(updateProfile, 0, 5000);
    
    }
    
    
    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        Toast.makeText(this, "Service Stopped", Toast.LENGTH_SHORT).show();
        timer.cancel();
    }
    
    
    
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }
    
    }
    

    3级

    package com.example.connect;
    
    import java.util.TimerTask;
    
    import android.content.Context;
    import android.os.Handler;
    import android.widget.Toast;
    public class CustomTimerTask extends TimerTask {
    
    
    private Context context;
    private Handler mHandler = new Handler();
    
    public CustomTimerTask(Context con) {
        this.context = con;
    }
    
    
    
    @Override
    public void run() {
        new Thread(new Runnable() {
    
            public void run() {
    
                mHandler.post(new Runnable() {
                    public void run() {
                       Toast.makeText(context, "In Timer", Toast.LENGTH_SHORT).show();
    
                    }
                });
            }
        }).start();
    
    }
    
    }
    
  • 2

    我正试图用我自己的观点做自己的祝酒 .

    我成功地结合了你的方法 . 以下代码允许我显示toast并更改/删除视图而不会崩溃,只需将 MyTimerTask 构造函数的参数更改为您需要处理的任何内容 .

    public void yourFunction(){
    
        Timer timer = new Timer();
        MyTimerTask mtc = new MyTimerTask(this.getContext(), tvNotice);
        timer.schedule(mtc, 1000);
    }
    
    private class MyTimerTask extends TimerTask {
    
        private TextView tv;
        private Context context;
        public MyTimerTask(Context pContext, TextView pTv) {
            this.tv = pTv;
            this.context = pContext;
        }
        @Override
        public void run() {
            updateUI.sendEmptyMessage(0);
        }
    
        private Handler updateUI = new Handler(){
            @Override
            public void dispatchMessage(Message msg) {
                super.dispatchMessage(msg);
    
    
                tv.setText("TextView Message");
                Toast.makeText(context, "Toast Message", 0).show();
            }
        };
    }
    

相关问题