Как отобразить тост внутри таймера? - PullRequest
6 голосов
/ 07 марта 2011

Я хочу отобразить всплывающее сообщение внутри таймера, и я использовал следующий код:

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 ]

6 голосов
/ 07 марта 2011

Вы не можете делать обновления пользовательского интерфейса внутри отдельного потока, как таймер. Вы должны использовать объект-обработчик для обновления пользовательского интерфейса:

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);
2 голосов
/ 03 апреля 2014

Самый простой способ (ИМО):

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 голосов
/ 11 августа 2012

Я хотел сделать простой проект, который мог бы отображать тост в таймере.Таймер будет запущен с использованием службы.Затем таймер запускается при запуске службы и останавливается при остановке службы.

Класс 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();

}

}
0 голосов
/ 19 января 2012

Я пытаюсь сделать свой собственный тост с моими собственными взглядами.

Я успешно объединил ваши подходы.Следующий код позволяет мне показывать тосты и изменять / удалять представления без сбоев, просто измените параметры конструктора 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();
        }
    };
}
0 голосов
/ 07 марта 2011

Вам нужен доступ к контексту приложения, чтобы сделать это.Попробуйте создать свой собственный класс, который принимает контекст в качестве входного параметра:

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);
0 голосов
/ 07 марта 2011

создать Handler и отобразить тост в этом

private Handler handler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            // Toast here
        }
    };
0 голосов
/ 07 марта 2011

Вы должны позвонить UIThread, чтобы показать тост.не из потока таймера.

иначе вызовите поток пользовательского интерфейса из этого потока таймера.

эта ссылка поможет вам,

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

и это

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

спасибо.

...