无法获得对我的Service实例的引用以成功将其传递给处理程序

如何解决无法获得对我的Service实例的引用以成功将其传递给处理程序

|| 我将继续在Pro Android 2的此Service示例(第304页)上继续前进,该Service示例又由两个类组成:MainActivity.java和BackgroundService.java都如下所示。我最近的障碍是获取并使用对Service实例的引用,以成功将其传递给处理程序。 从网络搜索中,我发现了将处理程序传递给Service实例的丑陋方法,但这种方法不起作用。在此过程的下一步中,我将不胜感激-使它正常工作。请查看我在该文档下面的注释和代码,我试图通过绑定按钮(bindBtn)将处理程序传递给Service实例。
    public class MainActivity extends Activity {
        private static final String TAG = \"MainActivity\";

        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            Log.d(TAG,\"starting service\");

            Button bindBtn = (Button)findViewById(R.id.bindBtn);
            bindBtn.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View arg0) {
                    Intent backgroundService = new Intent(MainActivity.this,com.marie.mainactivity.BackgroundService.class);
                    startService(backgroundService);

                    // wait until BackgroundService has started
                    while (BackgroundService.getInstance() == null);
                    // get instance of BackgroundService
                    BackgroundService sInstance = BackgroundService.getInstance();

                    // now finally pass the handler to the Service              
                    sInstance.setHandler(handler);
                }
            });

            Button unbindBtn = (Button)findViewById(R.id.unbindBtn);
            unbindBtn.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View arg0) {
                    stopService(new Intent(MainActivity.this,BackgroundService.class));
                }
            });
        }
    }

    // The handler to be passed to the Service
    private final Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            String msgObj = (String) msg.obj;
            int arg1 = msg.arg1;
            int arg2 = msg.arg2;
            int what = msg.what;
            Log.i(\"handleMessge\",\"msgObj: \" + msgObj + \",\" + \"arg1: \" + arg1 + \",\" + \"arg2: \" + arg2 + \",\" + \"what: \" + what);  
        }
    };
现在BackgroundService:
    public class BackgroundService extends Service {
        private NotificationManager notificationMgr;

        private Handler mHandler;
        private static Service sInstance = null;

        @Override
        public void onCreate() {
            super.onCreate();

            notificationMgr = NotificationManager)getSystemService(NOTIFICATION_SERVICE);

            displayNotificationMessage(\"starting Background Service\");

            Thread thr = new Thread(null,new ServiceWorker(),\"BackgroundService\");
            thr.start();
        }   

        class ServiceWorker implements Runnable
        {
            public void run() {
                //Use the handler to send a message
                Message msg = new Message();
                msg.obj = \"msg obj\";
                msg.arg1 = 1;
                msg.arg2 = 2;
                msg.what = 3;
                mHandler.sendMessage(msg);

                //stop when done
                BackgroundService.this.stopSelf();
            }
        }

        @Override
        public void onDestroy()
        {
            displayNotificationMessage(\"stopping Background Service\");
            super.onDestroy();
        }

        @Override
        public void onStart(Intent intent,int startId) {
            super.onStart(intent,startId);
        }

        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }

        private void displayNotificationMessage(String message)
        {
            Notification notification = new Notification(R.drawable.note,message,System.currentTimeMillis());

            PendingIntent contentIntent = PendingIntent.getActivity(this,new Intent(this,MainActivity.class),0);

            notification.setLatestEventInfo(this,\"Background Service\",contentIntent);

            notificationMgr.notify(R.id.app_notification_id,notification);
        }
    }
我的目标是在使用绑定按钮(bindBtn)绑定到服务后,将处理程序传递给服务,并向处理程序发送一条消息。但是我在com.marie.mainactivity中得到了一个ANR:ERROR / ActivityManager(96):ANR。显然,这似乎是将处理程序传递给Service的错误方法,因为它不起作用。 我正尝试在下面发布ANR的Logcat:
D/MainActivity(24622): starting service

I/ActivityManager(   96): Displayed com.marie.mainactivity/.MainActivity: +434ms

D/dalvikvm(23879): GC_EXPLICIT freed 5K,50% free 2740K/5379K,external 1625K/2137K,paused 79ms

D/dalvikvm(18736): GC_EXPLICIT freed 28K,49% free 2793K/5379K,paused 740ms

D/dalvikvm(18551): GC_EXPLICIT freed 32K,49% free 2967K/5767K,paused 583ms

D/dalvikvm(  192): GC_EXPLICIT freed 42K,53% free 3950K/8327K,external 12167K/12379K,paused 1000ms

W/ActivityManager(   96): Timeout executing service: ServiceRecord{4078d160 com.marie.mainactivity/.BackgroundService}

I/Process (   96): Sending signal. PID: 24622 SIG: 3

I/dalvikvm(24622): threadid=4: reacting to signal 3

I/dalvikvm(24622): Wrote stack traces to \'/data/anr/traces.txt\'

I/Process (   96): Sending signal. PID: 96 SIG: 3

I/dalvikvm(   96): threadid=4: reacting to signal 3

I/dalvikvm(   96): Wrote stack traces to \'/data/anr/traces.txt\'

I/Process (   96): Sending signal. PID: 184 SIG: 3

I/dalvikvm(  184): threadid=4: reacting to signal 3

I/dalvikvm(  184): Wrote stack traces to \'/data/anr/traces.txt\'

I/Process (   96): Sending signal. PID: 158 SIG: 3

I/dalvikvm(  158): threadid=4: reacting to signal 3

I/dalvikvm(  158): Wrote stack traces to \'/data/anr/traces.txt\'

D/dalvikvm(   96): GC_EXPLICIT freed 1045K,41% free 6408K/10759K,external 2855K/3554K,paused 126ms

E/ActivityManager(   96): ANR in com.marie.mainactivity

E/ActivityManager(   96): Reason: Executing service com.marie.mainactivity/.BackgroundService

E/ActivityManager(   96): Load: 2.86 / 2.27 / 1.69

E/ActivityManager(   96): CPU usage from 20840ms to 0ms ago:

E/ActivityManager(   96):   93% 24622/com.marie.mainactivity: 93% user + 0% kernel / faults: 536 minor

E/ActivityManager(   96):   1.4% 73/akmd: 0% user + 1.4% kernel

E/ActivityManager(   96):   0.5% 96/system_server: 0.2% user + 0.2% kernel / faults: 9 minor

E/ActivityManager(   96):   0.1% 23879/com.google.android.apps.uploader: 0.1% user + 0% kernel / faults: 49 minor

E/ActivityManager(   96):   0.1% 192/com.android.launcher: 0.1% user + 0% kernel / faults: 69 minor

E/ActivityManager(   96):   0.1% 18551/android.process.acore: 0.1% user + 0% kernel / faults: 54 minor

E/ActivityManager(   96):   0.1% 18736/android.process.media: 0.1% user + 0% kernel / faults: 49 minor

E/ActivityManager(   96):   0% 158/com.android.systemui: 0% user + 0% kernel

E/ActivityManager(   96):   0% 5/events/0: 0% user + 0% kernel

E/ActivityManager(   96):   0% 48/synaptics_wq: 0% user + 0% kernel

E/ActivityManager(   96):   0% 56/ds2784-battery: 0% user + 0% kernel

E/ActivityManager(   96): 96% TOTAL: 96% user + 0.3% kernel

E/ActivityManager(   96): CPU usage from 378ms to 893ms later:

E/ActivityManager(   96):   94% 24622/com.marie.mainactivity: 94% user + 0% kernel

E/ActivityManager(   96):     94% 24622/ie.mainactivity: 94% user + 0% kernel

E/ActivityManager(   96):   3.8% 96/system_server: 1.9% user + 1.9% kernel

E/ActivityManager(   96):     3.8% 115/ActivityManager: 1.9% user + 1.9% kernel

E/ActivityManager(   96):   1.3% 73/akmd: 0% user + 1.3% kernel

E/ActivityManager(   96):     1.3% 24209/akmd: 0% user + 1.3% kernel

E/ActivityManager(   96): 100% TOTAL: 98% user + 1.9% kernel

I/Process (   96): Sending signal. PID: 24622 SIG: 9

W/ActivityManager(   96):   Force finishing activity com.marie.mainactivity/.MainActivity

I/ActivityManager(   96): Killing com.marie.mainactivity (pid=24622): user\'s request

I/ActivityManager(   96): Process com.marie.mainactivity (pid 24622) has died.

W/ActivityManager(   96): Service crashed 2 times,stopping: ServiceRecord{4078d160 com.marie.mainactivity/.BackgroundService}

I/WindowManager(   96): WIN DEATH: Window{407b7a70 com.marie.mainactivity/com.marie.mainactivity.MainActivity paused=true}

V/RenderScript_jni(  192): surfaceCreated

V/RenderScript_jni(  192): surfaceChanged

W/InputManagerService(   96): Got RemoteException sending setActive(false) notification to pid 24622 uid 10081

I/ActivityManager(   96): Start proc com.amazon.mp3 for service com.amazon.mp3/.service.DownloadService: pid=24632 uid=10055 gids={3003,1015}

I/ActivityThread(24632): Pub com.amazon.mp3.client.SearchSuggestionProvider: com.amazon.mp3.client.SearchSuggestionProvider

D/Configuration(24632): active site = local

D/FREESPACE(24632): Bytes to fill: 107900928

D/Configuration(24632): active site = remote

I/Gmail   (24587): calculateUnknownSyncRationalesAndPurgeInBackground: queueing

I/Gmail   (24587): calculateUnknownSyncRationalesAndPurgeInBackground: running

I/Gmail   (24587): MainSyncRequestProto: lowestBkwdConvoId: 0,highestHandledServerOp: 687539,normalSync: true

D/dalvikvm(24587): GC_CONCURRENT freed 1165K,54% free 3133K/6727K,paused 3ms+4ms

D/dalvikvm(24587): GC_CONCURRENT freed 617K,55% free 3081K/6727K,paused 11ms+2ms

D/dalvikvm(24587): GC_EXPLICIT freed 160K,55% free 3083K/6727K,paused 54ms

I/Gmail   (24587): MainSyncRequestProto: lowestBkwdConvoId: 0,highestHandledServerOp: 687616,normalSync: true

D/Gmail   (24587): Inserting message 1371513932623117837. synced=true

D/dalvikvm(24587): GC_EXPLICIT freed 123K,54% free 3127K/6727K,paused 63ms

I/Gmail   (24587): MainSyncRequestProto: lowestBkwdConvoId: 0,highestHandledServerOp: 687618,normalSync: true

I/Gmail   (24587): Sending notification intent: Intent { act=android.intent.action.PROVIDER_CHANGED dat=content://gmail-ls/unread/^i (has extras) }

I/AudioService(   96):  AudioFocus  requestAudioFocus() from android.media.AudioManager@4074e410

W/AudioFlinger(   68): write blocked for 167 msecs,27 delayed writes,thread 0xea00

I/AudioService(   96):  AudioFocus  abandonAudioFocus() from android.media.AudioManager@4074e410

D/AudioHardwareQSD(   68): AudioHardware pcm playback is going to standby.

D/dalvikvm(24587): GC_EXPLICIT freed 88K,54% free 3138K/6727K,paused 98ms

I/ActivityManager(   96): Start proc org.my_pod.mypod for service org.my_pod.mypod/net.robmunro.mypod.UpdateFeedsService: pid=24654 uid=10080 gids={3003,1015}

D/dalvikvm(   67): GC_EXPLICIT freed 11K,50% free 2717K/5379K,paused 68ms

D/dalvikvm(   67): GC_EXPLICIT freed <1K,paused 63ms

I/ActivityThread(24654): Pub org.my_pod.mypod: net.robmunro.mypod.util.MyPodContentProvider

D/dalvikvm(   67): GC_EXPLICIT freed <1K,paused 74ms
关于创建服务实例时我做错了什么的任何建议,以便我可以像处理程序一样传递给它,将不胜感激。     

解决方法

        我建议将ѭ3传递给服务,并使用它向
Handler
发送ѭ4。这是一个演示此情况的示例应用程序。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-