公子堇 2019-04-08 16:21 采纳率: 0%
浏览 600
已采纳

在service里使用加速度传感器,软件却始终闪退

不知道为什么,明明我的service结构也没写错,做些小事也可以,但是将传感器放在里面运行就会导致程序闪退。
代码如下:

@Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        bt=(Button)view.findViewById(R.id.startSpeed);
        t1=(TextView)view.findViewById(R.id.showSpeed);

        //接受service发出的广播,注册监听
        rec = new MyReceiver();
        getActivity().registerReceiver(rec,new IntentFilter("fromSpeedService"));

        /*开始测速监听*/
        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //获取服务对象
                Intent it= new Intent(getActivity(), SpeedService.class);
                //检测服务是否已经在运行,防止二次启动
                if(isServiceRunning())
                    Toast.makeText(getActivity(),"测速服务已在运行",Toast.LENGTH_SHORT).show();
                else{
                    getActivity().startService(it);
                    Toast.makeText(getActivity(),"已开始后台测速",Toast.LENGTH_SHORT).show();
                }
            }
        });

    }
        //接受广播消息处理
    private class MyReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent){
            t1.setText(intent.getStringExtra("i"));
        }
    }
public class SpeedService extends Service {
    private final String TAG="dd";
    private TextView t1,t2,t3,t4,t5;
    private SensorManager speedManager;
    private Sensor sensor;
    private  Listener listener;
    private Intent it;
    private PowerManager powerManager=null;
    private PowerManager.WakeLock wakeLock =null;

    public SpeedService() {
        it=new Intent("fromSpeedService");
    }


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

        new Thread(new Runnable() {
            @Override
            public void run() {
                /*int i=10;
                it.putExtra("i",Integer.toString(i));
                sendBroadcast(it);*/

                //获取传感器管理器
                speedManager=(SensorManager)getSystemService(SENSOR_SERVICE);
                //检测是否存在该传感器
                sensor=speedManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);
                if(sensor==null) {
                    Toast.makeText(SpeedService.this,"不存在加速度传感器!",Toast.LENGTH_SHORT).show();
                } else{
                    //给传感器注册监听器
                    listener=new Listener();
                    speedManager.registerListener(listener,sensor,SensorManager.SENSOR_DELAY_NORMAL);
                    Toast.makeText(SpeedService.this,"111111",Toast.LENGTH_SHORT).show();
                }
/*
                powerManager=(PowerManager)getSystemService(Context.POWER_SERVICE);
                wakeLock=powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK,this.getClass().getName());
                wakeLock.acquire();*/
            }
        }).start();

    }

    @Override
    public IBinder onBind(Intent intent) {
        throw new UnsupportedOperationException("Not yet impelmented");
    }

    //启动service
    @Override
    public int onStartCommand(Intent intent,int flags,int startId){
        return super.onStartCommand(intent,flags,startId);
    }

    //结束服务时取消注册监听
    @Override
    public void onDestroy(){
        speedManager.unregisterListener(listener);
        super.onDestroy();
    }

    //重载的传感器监听器类
    private class Listener implements SensorEventListener {
        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy){ }

        @Override
        public void onSensorChanged(SensorEvent event) {
            int sensorType=event.sensor.getType();
            //获取传感器类型
            if(sensorType==Sensor.TYPE_LINEAR_ACCELERATION){
                float[] value=event.values;
                float acc=(float)Math.sqrt(Math.pow(value[0],2)+Math.pow(value[1],2)+Math.pow(value[2],2));
                String aa=Integer.toString(Math.round(acc));

                it.putExtra("i",aa);

                sendBroadcast(it);

            }
        }

        //处理速度与加速度
        public void handleData(int speed,int Aspeed){
        }
    }
}

麻烦大佬们帮我看一下,这个service我是通过fragment里的一个按钮启动的,但每次一启动程序就闪退,头发都要愁掉光了。。。

  • 写回答

2条回答 默认 最新

  • 公子堇 2019-04-08 16:52
    关注

    。。。原来反了个低级错误,真是贻笑大方了,没有看错误日志,哈哈。我的问题就是在service里面使用了toast,service是运行在主线程的,而我在service里面又开了一个线程,就相当于toast是在子线程。。。但是!!!toast是不能再子线程显示的!!!!哎,记住教训吧。。。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 西南科技大学数字信号处理
  • ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
  • ¥30 STM32 INMP441无法读取数据
  • ¥15 R语言绘制密度图,一个密度曲线内fill不同颜色如何实现
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥15 pyqt信号槽连接写法
  • ¥500 把面具戴到人脸上,请大家贡献智慧,别用大模型回答,大模型的答案没啥用
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。