Как найти причину петли в listadapter Bluetooth? - PullRequest
0 голосов
/ 06 ноября 2019

Я новичок в Android Studio и пишу приложение, включающее функции Bluetooth. при заполнении моего списка с помощью обнаружения Bluetooth, мой getview для listadpater зацикливается 3 раза для каждого элемента в обнаруженном списке.

я потратил последние 4 часа, гоняясь за этим циклом, включая документацию по android, различные сообщения stackoverflow безответ (только один подошел близко, и единственный совет был «не беспокойтесь об этом»: android: мой цикл дубликатов ListAdapter Я поместил несколько строк sout в код, чтобы консоль показывала точно, где происходит цикл. У меня естьрефакторинг кода неоднократно, следуя различным советам онлайн, но я не могу найти ПОЧЕМУ цикл происходит, не говоря уже о том, как его остановить.

извинения, если код или вопрос плохо отформатирован: мой первый пост

широковещательныйфункция кнопки вызова получателя и широковещательный приемник

//discover devices
public void btnScanBtDev() {
    Log.d(TAG, "btnScabBtDev: looking for devices... ");

    //empty list if already populated (for more than one scan)
    mBTDevices = new ArrayList<>();

    //check if already in discovery mode
    if (mBluetoothAdapter.isDiscovering()) {
        mBluetoothAdapter.cancelDiscovery();
        Log.d(TAG, "btnDiscover: Canceling discovery.");
    }
    mBluetoothAdapter.startDiscovery();
    IntentFilter discoverDevicesIntent = new IntentFilter(BluetoothDevice.ACTION_FOUND);
    registerReceiver(mBroadcastReceiver3, discoverDevicesIntent);
}



private BroadcastReceiver mBroadcastReceiver3 = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();
        Log.d(TAG, "broadcastReceiver3 (pairing): ACTION FOUND.");

        if (action.equals(BluetoothDevice.ACTION_FOUND)) {
            BluetoothDevice device =intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            System.out.println("new device object created");

            mBTDevices.add(device);
            Log.d(TAG, "broadcastReceiver3: BT_device name & address: "
                    + device.getName() + ": " + device.getAddress());
            mDeviceListAdapter = new DevLisAdap(context,R.layout.adapter_device_view, mBTDevices);

            System.out.println("setting adapter");
    //the loop occurs after this message so it must be executed by the following line?:
            lvNewDevices.setAdapter(mDeviceListAdapter);
        }
    }
}

список адаптеров класса:

package com.example.bluetoothreceiver_v02;

import android.bluetooth.BluetoothDevice;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import java.util.ArrayList;

public class DevLisAdap extends ArrayAdapter<BluetoothDevice> {
private static final String TAG = "DevListAdap";

private LayoutInflater mLayoutInflater;
private ArrayList<BluetoothDevice> mDevices;
private int mViewResourceId;

public DevLisAdap(Context context, int tvResourceId, ArrayList<BluetoothDevice> devices) {
    super(context, tvResourceId, devices);
    System.out.println("getview constructor");
    this.mDevices = devices;
    mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    mViewResourceId = tvResourceId;
}


//method seems to loop 3x for each discovered item?
public View getView(int position, View convertView, ViewGroup parent) {
    System.out.println("begin getview");
    //counter to prove if entire method is called each time
    int counter =0;
    System.out.println("counter: "+counter);

    View conView = convertView;
    if(conView==null){
        conView = mLayoutInflater.inflate(mViewResourceId, null);
        System.out.println("inflated");
    }
    BluetoothDevice device = mDevices.get(position);

    if (device != null) {
        Log.d(TAG, "getView: BT_device exists.");
        TextView deviceName = (TextView) conView.findViewById(R.id.tvDeviceName);
        TextView deviceAdress = (TextView) conView.findViewById(R.id.tvDeviceAddress);

        if (deviceName != null) {
            System.out.println("name set");
            deviceName.setText(device.getName());
        } else {
            Log.d(TAG, "getView: BT_device name is NULL!!");
        }
        if (deviceAdress != null) {
            System.out.println("add set");
            deviceAdress.setText(device.getAddress());
        } else {
            Log.d(TAG, "getView: BT_device address is NULL!!");
        }
    } else {
        Log.d(TAG, "BT_device is NULL!!");
    }
    System.out.println("end of getview");
    counter++;
    return conView;
}

}

выход (для первого элемента, имя и адрес удалены):

D/BluetoothActions: btnScanBtDev: looking for devices... 
D/BluetoothActions: broadcastReceiver3 (pairing): ACTION FOUND.
I/System.out: new device object created
D/BluetoothActions: broadcastReceiver3: BT_device name & address: xx
I/System.out: getview constructor
I/System.out: setting adapter
I/System.out: begin getview
counter: 0
I/System.out: inflated
I/System.out: name set
I/System.out: add set
I/System.out: end of getview
I/System.out: begin getview
counter: 0
name set
I/System.out: add set
end of getview
I/System.out: begin getview
I/System.out: counter: 0
name set
I/System.out: add set
I/System.out: end of getview
D/BluetoothActions: broadcastReceiver3 (pairing): ACTION FOUND.
...etcetc

кажется, что весь метод getView неоднократно (3 *) вызывается setAdapterдля каждого предмета обнаружена какая-то причина? (например, 1 элемент = 3 цикла, 4 элемента = 3 + 6 + 9 + 12 циклов = 30 и т. д.), хотя это не проблема для небольшого списка, это быстро приводит к большому количеству итераций! не говоря уже о том, что сводит с ума то, что он не может видеть, откуда он взялся? это стандартное поведение андроида, которое я не могу найти объяснение?

...