android - 服务在循环时崩溃 - Android Studio

标签 android

我基本上是想打开一个服务,每 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/

相关文章:

android - 钛锻造UI : application crashing with no apparent reason

java - 绘图表面、unlockCanvasAndPost 和 IllegalArgumentException

android - 为什么 Android 的 ImageReader 类这么慢?

java - 是否有可能在 Android 或黑莓上运行小程序?

android - 为什么 alert.getButton(AlertDialog.BUTTON_POSITIVE) 返回 NULL?

java - 使用来自另一个类/Activity 的适配器

android - 在 android2.3.3 上使用 jquery 的 ssn 掩码

java - 如何从 maps.googleapis 获取 3 点之间的方向

android - 无法从 Android/iOS 上的 FirebaseAuthentication 检索电子邮件

Android - AdMob 将广告设置为“消失”?