我基本上是想打开一个服务,每 10 秒就会显示一个 toast 说“10 秒过去了” 这就是我正在尝试做的事情 经过多次研究,我发现要循环服务我 需要使用 while (true) - sleep... 方法... 但每次我启动服务时,服务或我的应用程序都会崩溃 (或者确切地说,每次计时器用完时)
我的问题是什么?
我的猜测是,也许我传递给 toast 的 contaxt 是错误的? 也许还有另一种方法可以在循环中(在服务内)每 10 秒显示一次 toast?
这是我的服务
package com.greenroad.candidate.mywallpaperchanger;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;
/**
* Created by pitsponet on 31/08/2015.
*/
public class myService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
Toast.makeText(getApplicationContext(), "service created",
Toast.LENGTH_LONG).show();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//try to run loop for showing up a toast
new Thread(new Runnable(){
public void run() {
// TODO Auto-generated method stub
while(true)
{
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//REST OF CODE HERE//
Toast.makeText(getApplicationContext(), "service started",
Toast.LENGTH_LONG).show();
}
}
}).start();
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(getApplicationContext(), "service stoped",
Toast.LENGTH_LONG).show();
}
}
最佳答案
正如 Brad 所解释的,崩溃的原因是您尝试从非 UI Thread
执行 UI 操作。
要实现您想要执行的操作,请在您的服务中使用以下代码。首先删除 onStartCommand()
Thread
public class MyService extends Service {
private Handler mHandler;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
mHandler = new Handler();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
mHandler.postDelayed(ToastTask, 10000); // Starts the loop here
super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
// Stop the loop
mHandler.removeCallbacks(ToastTask);
super.onDestroy();
}
private Runnable ToastTask = new Runnable() {
@Override
public void run() {
Toast.makeText(MyService.this, "10 Seconds have passed", Toast.LENGTH_SHORT).show();
// Schedule this Runnable to run again after 10 sec
mHandler.postDelayed(this, 10000);
}
}
}
关于android - 服务在循环时崩溃 - Android Studio,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32318444/