我创建了一个服务类,现在我正试图在这个类中运行一个新线程。服务是在我的MainActivity
中启动的,这很有效。 Toast.Message
部分中的第一个onCreate()
显示,但我的帖子runa()
中的消息未出现。认为它应该适用于新的Runnable()
。
public class My Service extends Service {
private static final String TAG = "MyService";
Thread readthread;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show(); //is shown
readthread = new Thread(new Runnable() { public void run() { try {
runa();
} catch (Exception e) {
//TODO Auto-generated catch block
e.printStackTrace();
} } });
readthread.start();
Log.d(TAG, "onCreate");
}
@Override
public void onDestroy() {
Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
Log.d(TAG, "onDestroy");
}
@Override
public void onStart(Intent intent, int startid) {
//Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
//Log.d(TAG, "onStart");
}
public void runa() throws Exception{
Toast.makeText(this, "test", Toast.LENGTH_LONG).show(); //doesn't show up
}
}
如果有人可以帮助我会很好:)
答案 0 :(得分:5)
您正在创建的Thread
将不会在MainThread
上执行,因此您无法从中显示Toast
。要从后台Toast
显示Thread
,您必须使用Handler
,并使用Handler
来显示Toast
。
private MyService extends Service {
Handler mHandler=new Handler();
//...
public void runa() throws Exception{
mHandler.post(new Runnable(){
public void run(){
Toast.makeText(MyService.this, "test", Toast.LENGTH_LONG).show()
}
}
}
}
这将是您确切问题的解决方案,虽然我认为它不是一个好的“架构”或练习,因为我不知道您想要实现的目标。
答案 1 :(得分:0)
您无法从非UI线程显示Toast。您的服务正在主线程上运行,但您正在后台线程中运行runa()
方法。您必须使用处理程序并要求它在UI线程上显示Toast。请参阅this answer以了解如何完成此操作。
答案 2 :(得分:0)
从线程更新UI的最佳方法是使用处理程序或UIThread
试试此代码:,不要忘记先将服务放入Manifest
文件。
class CapturingSerivce extends Service {
Handler mHandler=new Handler();
@Override
public IBinder onBind(Intent intent) {
return null;
}
public void runa() throws Exception{
mHandler.post(new Runnable(){
public void run(){
}
});
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
}