【问题标题】:Android How to keep a method running?Android 如何保持方法运行?
【发布时间】:2014-03-08 00:12:19
【问题描述】:

我试图将加速器传感器的 x、y、z 轴数据值放在 textview 视图上。当我将 setTextview 函数放入名为onSensorChangedSensorEventListener's(接口)回调方法中时,我设法读取了实时值。

据我所知,当传感器的值更新时,回调方法会发送对象中的值,通过实现此接口,我们可以接收这些值。不知何故,传感器管理器(托管侦听器和事件生成方法的类)连续读取传感器值,因此我们实现的方法可以通过 settext 方法将值放入 textview。

我不明白 Sensor Manager 的方法如何继续工作?我试图在方法中编写一个由按钮调用的循环,但我认为这些循环结果是无限循环,Android 出错并停止了应用程序。循环方法似乎没有耐心,它们试图尽快返回或中断。我应该使用线程吗?或者有没有办法创建一个持续运行的方法?

     @Override
        public void onSensorChanged(SensorEvent event) {
            if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER)
                return;

            mSensorX = event.values[0];
            mSensorY = event.values[1];
            mSensorZ = event.values[2];
            mSensorTimeStamp = event.timestamp;
            mCpuTimeStamp = System.nanoTime();

//            TextView mTextView1 = (TextView) findViewById(R.id.textView1);
//          mTextView1.setText("X ekseninde " + mSensorX + " deger");
//          
//          TextView mTextView2 = (TextView) findViewById(R.id.textView2);
//          mTextView2.setText("Y ekseninde " + mSensorY + " deger");
//          
//          TextView mTextView3 = (TextView) findViewById(R.id.textView3);
//          mTextView3.setText("Z ekseninde " + mSensorZ + " deger");
//          
//          TextView mTextView4 = (TextView) findViewById(R.id.textView4);
//          mTextView4.setText("Sensor TimeStamp  " + mSensorTimeStamp + " time");
//          
//          TextView mTextView5 = (TextView) findViewById(R.id.textView5);
//          mTextView5.setText("Cpu TimeStamp " + mCpuTimeStamp + " time");

        }

        public void startSimulation(View v) {
            mLever = true;
            mSimulator.startSimulation1(mLever);

        }

        public void stopSimulation (View v) {
            mLever = false;
            mSimulator.stopSimulation2();
        }

        class Simulator {



        public boolean startSimulation1(boolean x) {

            mLever = x;
            if (mLever == true) {

            TextView mTextView1 = (TextView) findViewById(R.id.textView1);
            mTextView1.setText("X ekseninde " + mSensorX + " deger");

            TextView mTextView2 = (TextView) findViewById(R.id.textView2);
            mTextView2.setText("Y ekseninde " + mSensorY + " deger");

            TextView mTextView3 = (TextView) findViewById(R.id.textView3);
            mTextView3.setText("Z ekseninde " + mSensorZ + " deger");

            TextView mTextView4 = (TextView) findViewById(R.id.textView4);
            mTextView4.setText("Sensor TimeStamp  " + mSensorTimeStamp + " time");

            TextView mTextView5 = (TextView) findViewById(R.id.textView5);
            mTextView5.setText("Cpu TimeStamp " + mCpuTimeStamp + " time");

            return startSimulation1(true);

            }
            else
            return false;

                }

【问题讨论】:

    标签: java android multithreading loops methods


    【解决方案1】:

    应用程序之前停止的原因是因为您可能会在主线程上进入无限循环。 尝试启动一个新线程并在那里运行你的循环。请记住,对 UI (setText) 的任何更新都需要在 UI 线程上完成。 这可以通过将runnables 发送到 UI 线程的handler 来实现,如下所示:

    Handler handler = new Handler(Looper.getMainLooper());
    handler.post(new Runnable(){
        public void run(){
            mTextView5.setText("Cpu TimeStamp " + mCpuTimeStamp + " time");
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-29
      • 2018-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多