2014-12-08 2 views
-3

Привет, я знаю, что есть много ответов на эту тему. Но я много пробовал, и он не работает. Я хочу показать тост внутри потока сервиса. Как я могу решить эту проблему. Использование getApplicationContext() и т. Д. Не работает.Показать тост в потоке сервиса

Я запускаю Службу из Activity (без ограничений).

public class CarDataService extends Service { 
    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
    ... 
    startThreadUpdatingDatabase(); 
    Toast.makeText(this, message, Toast.LENGTH_LONG).show(); //it works 
    } 

    private void startThreadUpdatingDatabase(){ 
     Log.d("Database", "startThreadUpdatingDatabase(was called)"); 
     new Thread(new Runnable() { 
      public void run(){ 
       .. 
       // here i want to use a toast!!! 
      } 
     }).start(); 
    } 

} 

Спасибо!

+1

Вы не можете показать Тост от не-UI потока. Не делайте нисходящие ответы, которые явно правильны. –

+0

вы просто опускаете ответы, потому что не получили от этого выгоды? Я хочу знать, кто так ответил на все ответы? –

ответ

1

Вы должны начать нить:

new Thread(new Runnable() { 
      @Override 
      public void run() { 
       Toast.makeText(getApplicationContext(),"Your message",Toast.LENGTH_LONG).show(); 
      } 
    }).start(); 
+0

извините. в моем коде я начал поток. Ошибка копирования пасты – d4rty

1
public Contect context; 

переменную-член

onStartCommand(){ 
context = getApplicationContext) 
} 

acquivre ссылка на контекст, прежде чем начать нить

new Thread(new Runnable() { 
       @Override 
       public void run() { 
        Toast.makeText(context,"Your message",Toast.LENGTH_LONG).show(); 
       } 
     }).start(); 

и там вы go

использование AsyncTask вместо этого помогает в управлении контекстом

http://www.androidsnippets.com/use-toast-wherever-you-want

+0

Ваше решение не работает. Когда приложение достигнет точки Toast.makeText (контекст, «Ваше сообщение», Toast.LENGTH_LONG) .show(); приложение выйдет из строя. – d4rty

+0

Да, это решение является ошибочным. он попытается показать тост в контексте фонового потока. –

1

Покажите свой Тост с помощью UI-Thread

new Thread(new Runnable() { 
    @Override 
    public void run() { 

     // SHOW TOAST 
     activity.runOnUiThread(new Runnable() { 
      public void run() { 
       Toast.makeText(yourContext, "Hello from UI-thread", Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     //... start DB work 

    } 
}).start(); 

Если у вас нет доступа к деятельности, так что это так:

new Thread(new Runnable() { 
    @Override 
    public void run() { 

     // no activity, so use Handler & mainlooper 
     new Handler(Looper.getMainLooper()).post(
      new Runnable() { 
       public void run() { 
        // yourContext is Activity or Application context 
        Toast.makeText(yourContext, "Hello from UI-thread", Toast.LENGTH_SHORT).show(); 
       } 
      } 
     ); 

     //... start DB work 

    } 
}).start(); 

Посмотрите на это: Static Way to get Context on android?

+0

Что я возьму для занятий? У меня есть несколько видов деятельности, но я не могу взять класс. И что для yourContext? – d4rty

+0

Я обновил свой ответ. используйте Handler, если у вас нет ссылки на активность. – dit

1
Handler h = new Handler(context.getMainLooper()); 

    h.post(new Runnable() { 
     @Override 
     public void run() { 
      Toast.makeText(context,message,Toast.LENGTH_LONG).show(); 
     } 
    }); 

посмотреть, если это работает

Смежные вопросы