0

ネットワーク上のデバイスを検出するために、UDP ブロードキャストをリッスンする単純なスレッドがあります。ブロードキャストを受信するたびに、デバイスの IP を に追加するために、UI スレッドの に をRunnable投稿します。せいぜい、2 秒に 1 回パケットを受信します。投稿が 2 秒ごとにのみ発生することを確認しました。HandlerArrayList

私のアプリにもいくつかのフラグメントがあります。フラグメント間で使用を切り替えるたびにNavController.navigate()、100 ~ 400 のフレーム ドロップと ANR が発生します。スレッドを無効にするか、重複の検索とデバイスの追加を無効にするだけでもArrayList、フレームのドロップはなくなりますが、検索と追加にかかる時間は 1 ミリ秒未満です (デバッグ プリントによると)。

の問題に関する他のスレッドをたくさん読みましたHandlersが、どれも役に立ちませんでした。私の投稿がなぜ多くのフレームドロップを引き起こしているのか、何か考えはありますか?

スレッドの実行方法は次のとおりです。

public void run(){
            try {
                DatagramSocket ds = new DatagramSocket(DISCOVERY_PORT);
                ds.setSoTimeout(500);
                ds.setBroadcast(true);
                byte[] rxBuffer = new byte[1024];
                DatagramPacket dp = new DatagramPacket(rxBuffer,rxBuffer.length);

                while (!this.isInterrupted()) {
                    try {
                        ds.receive(dp);

                        String msg = new String(rxBuffer, 0, dp.getLength());
                        dp.setLength(rxBuffer.length);
                        callbackH.post(new Runnable() {
                            @Override
                            public void run() {
                                addGeophone(dp.getAddress().toString(),Integer.parseInt(msg));
                            }
                        });
                    }
                    catch (SocketTimeoutException e){
                        continue;
                    }
                }

                ds.close();
            }
            catch(Exception e){
                e.printStackTrace();
            }
        }

そして、UI スレッドに投稿される addGeophone 関数:

    private static void addGeophone(String ipAddress, int id){
        boolean geophoneFound = false;
        Geophone g;
        //REMOVE BELOW HERE AND EVERYTHING SPEEDS UP.
        for (int i = 0; i < geophones.size(); i++){
            g = geophones.get(i);
            if (g.id == id){
                geophoneFound = true;
            }
        }
        if (!geophoneFound) {
            geophones.add(new Geophone(ipAddress, id));
       }
    }
4

1 に答える 1