Android不会让我进入无限循环

时间:2016-07-06 14:16:36

标签: java android

嗨我试着做一个搜索每5-10秒附近的蓝牙设备的应用程序,所以我试着做一个无限循环,但是当我按下启动循环的按钮时应用程序卡住了:

int stopInt=2;
serachB.setOnClickListener(
            new Button.OnClickListener() {
                public void onClick(View v) {
                    do {
                        final Handler handler = new Handler();
                        handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                listAdapter.clear();
                                getPairedDevices();
                                startDiscovery();

                            }
                        }, 4000);

                    } while (stopInt>1);
                }

3 个答案:

答案 0 :(得分:1)

private final Handler mMyhandler = new Handler();

private final Runnable checkBluetoothRunnable = new Runnable() {
    public void run() {

        //Do your work here

        mMyHandler.postDelayed(this, 5000);
    }

};

serachB.setOnClickListener(
    new Button.OnClickListener() {
        public void onClick(View v){
          mMyhandler.post(checkBluetoothRunnable);
        }
    }
}

答案 1 :(得分:0)

以这种方式改变:

serachB.setOnClickListener(
    new Button.OnClickListener() {
        public void onClick(View v) {
            final Handler handler = new Handler();
            handler.post(new Runnable() {
                @Override
                public void run() {
                    while(true){
                        listAdapter.clear();
                        getPairedDevices();
                        startDiscovery();
                        Thread.sleep(4000);
                    }
                } 
            });
        }}

答案 2 :(得分:0)

您不断在Handler循环中创建while的新实例,这会占用内存。如果你得到导致终止的OutOfMemoryError,我不会感到惊讶。尝试在循环外创建单个实例。

传递给Runnable的{​​{1}}在Handler上运行,因为它是在该线程上创建的。对于冗长的操作应该避免这种情况,而是委托给另一个线程。

  

创建新的Handler时,它将绑定到线程/消息   正在创建它的线程的队列

此外,您可以将UIThread类替换为使用Handler,而不是使用ScheduledThreadPoolExecutor类,这将为您提供一个线程池,然后可以定期执行您的设备发现代码。

首先创建一个ScheduledExecutorService

ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);

创建Runnable的实例:

MyRunnable deviceDiscovery = new MyRunnable();

然后在onClick方法中,您使用scheduleAtFixedRate

开始
ScheduledFuture<?> future = scheduledExecutorService.scheduleAtFixedRate(deviceDiscovery, 0, 1, TimeUnit.MINUTES);

然后,当您想要停止运行时,您需要致电cancel上的ScheduledFuture

future.cancel(true); // Set to true to say it can interrupt if already running