Android Service ... приложение вылетает при создании тоста - PullRequest
0 голосов
/ 13 апреля 2011

Это мой класс обслуживания:

public class MySrv extends Service {

@Override
public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();
    final Context c = getApplicationContext();
    Timer t = new Timer("mytimer");
    TimerTask task = new TimerTask() {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            Toast.makeText(c, "Not a beautyfull day today...", Toast.LENGTH_SHORT).show();
        }
    };
    t.schedule(task, 5000, 6000);
}

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
    }

}

Приложение вылетает в Toast.makeText () ... Так что я делаю не так?

Ответы [ 3 ]

3 голосов
/ 13 апреля 2011

Метод TimerTask run() не выполняется в потоке пользовательского интерфейса, поэтому вы не можете выполнять такие вещи, связанные с пользовательским интерфейсом, как создание Toast.

Исследование с использованием Handler или runOnUiThread() вместо.

Пример:

    final Handler handler = new Handler ();
    TimerTask task = new TimerTask() {
    @Override
    public void run() {
        handler.post (new Runnable (){
            @Override
            public void run() {
                Toast.makeText(c, "Not a beautyfull day today...", Toast.LENGTH_SHORT).show();
            }
         });
    }
1 голос
/ 13 апреля 2011

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

public class YourActivity extends Activity {
private Handler toastTeller;
public void onCreate(Bundle savedInstance) {
    super.onCreate(savedInstance);
        toastTeller = new Handler() {
           public void handleMessage(Message msg) {
             if (msg.what == 2)
                Toast.makeText(LibraryActivity.this, msg.obj.toString(),
                    Toast.LENGTH_LONG).show();
           super.handleMessage(msg);
           }
         };
     new Thread(new Runnable(){
        public void run(){
        Message msg = new Message();
        msg.what = 2;
        msg.obj = "Your item was downloaded.";
        toastTeller.sendMessage(msg);
        }
 }).start();
}
1 голос
/ 13 апреля 2011

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

Чтение Как отобразить тост в таймере?

...