MVP下扫描蓝牙得到列表实例

本文介绍了使用MVP架构进行蓝牙设备扫描的过程。包括定义接口、实现类、Activity及Adapter等关键部分,并提供了布局文件及具体代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天讲下一直让我很痛苦的蓝牙0.0。简单写了个小Demo来说下蓝牙扫描。

MVP的架构其实自己也不是很熟悉,自己就简单玩了一下。首先看下需要定义的接口代码:

/**
 * Created by Administrator on 2016/10/18.
 */
public interface IDeviceControlPresenter {
    /**
     * 数据刷新与加载
     */
    public void refreshData();

    /**
     * 扫描设备
     *
     * @param second
     *            扫描的时间/s
     */
    public void scanDevice(int second);

    /**
     * 停止扫描设备
     */
    public void stopScanDevice();
}
定义的这几个接口都是今天需要操作的。接下来看下这个接口的实现类:

/**
 * Created by Administrator on 2016/10/18.
 */
public class DeviceControlPresenter implements IDeviceControlPresenter {
    private BluetoothAdapter mBluetoothAdapter;
    private Activity mActivity;
    private Handler mTimer = new Handler();

    public DeviceControlPresenter(Activity activity) {

        mActivity = activity;
        BluetoothManager bluetoothManager = (BluetoothManager) mActivity.getSystemService(Context.BLUETOOTH_SERVICE);
        mBluetoothAdapter = bluetoothManager.getAdapter();
    }

    @Override
    public void refreshData() {
        ((DeviceScanActivity) mActivity).setRefreshing();
    }

    private int mSecond;
    @Override
    public void scanDevice(int second) {
        mSecond = second * 1000;
        if (!mBluetoothAdapter.isEnabled()) {//未打开蓝牙,提示打开
            Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            //mBaseListenerw.goToActivityForResult(enableBtIntent, Constants.REQUEST_BLE_ENABLE);
            mActivity.startActivityForResult(enableBtIntent,Constants.REQUEST_BLE_ENABLE);
        }
        mBluetoothAdapter.startLeScan(mLeScanCallback);
        mTimer.postDelayed(new Runnable() {
            @Override
            public void run() {
                    ((DeviceScanActivity) mActivity).stopScan();
            }
        }, mSecond);
    }

    @Override
    public void stopScanDevice() {
        mBluetoothAdapter.stopLeScan(mLeScanCallback);
        ((DeviceScanActivity) mActivity).refreshFinish();
    }


    /**
     * 设备扫描成功回调
     */
    private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {
        @Override
        public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
            // 必须更新在主线程中,不然列表不会刷新
            mActivity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                        ((DeviceScanActivity) mActivity).initDeviceList(device);
                }
            });
        }
    };
}

我们可以看到的是虽然是实现了IDeviceControlPresenter接口,但是一些具体的操作比如:
.setRefreshing();<pre name="code" class="java">.stopScan();
.refreshFinish();
.initDeviceList(device);


我们还是定义在Activity中。我们看下扫描设备的Activity的布局,只是简单的SwipeRefreshLayout和ListView.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/srl_task"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >

        <ListView
            android:id="@+id/listview"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/transparent"
            android:dividerHeight="1dip"
            android:scrollbars="none" />
    </android.support.v4.widget.SwipeRefreshLayout>

</RelativeLayout>
然后我们看下它的具体代码:

/**
 * Created by Administrator on 2016/10/18.
 */
public class DeviceScanActivity extends AppCompatActivity {

    private SwipeRefreshLayout mSwipeRefreshLayout;
    private ListView mDeviceList;
    private LeDeviceListAdapter mLeDeviceListAdapter;
    private IDeviceControlPresenter mDeviceScanPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_device_scan);

        mDeviceScanPresenter = new DeviceControlPresenter(DeviceScanActivity.this);

        initView();
        setListener();
    }

    private void setListener() {
        //下拉刷新
        mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                mDeviceScanPresenter.refreshData();
            }
        });


    }

    private void initView() {
        mDeviceList = (ListView) findViewById(R.id.listview);
        mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.srl_task);
        mLeDeviceListAdapter = new LeDeviceListAdapter(DeviceScanActivity.this);
        mDeviceList.setAdapter(mLeDeviceListAdapter);
        mSwipeRefreshLayout.setColorSchemeResources(R.color.black, R.color.black, R.color.black, R.color.black);
    }



    private Handler mHandler = new Handler() {
    };
    private static int SECOND = 10;

    public void setRefreshing() {
        // 使用handler解决mSwipeRefreshLayout.setRefreshing(true);无效问题
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                mSwipeRefreshLayout.setRefreshing(true);
                mDeviceScanPresenter.scanDevice(SECOND);
            }
        }, 500);
    }



    /**
     * 回调
     */
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == Constants.REQUEST_BLE_ENABLE && resultCode == Activity.RESULT_CANCELED) {
            finish();
            return;
        }
        super.onActivityResult(requestCode, resultCode, data);
    }


    public void stopScan() {
        mDeviceScanPresenter.stopScanDevice();
    }


    /**
     * 初始化设备列表
     */
    public void initDeviceList(BluetoothDevice device) {
        mLeDeviceListAdapter.addDevice(device);
        mLeDeviceListAdapter.notifyDataSetChanged();
    }

    /**
     * 刷新完成
     */
    public void refreshFinish() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mSwipeRefreshLayout.setRefreshing(false);
            }
        });
    }
}
这里还有一个Adapter:

/**
 * Created by Administrator on 2016/10/18.
 */
public class LeDeviceListAdapter extends BaseAdapter {
    private ArrayList<BluetoothDevice> mLeDevices;
    private LayoutInflater mInflator;

    public LeDeviceListAdapter(Context context) {
        super();
        mLeDevices = new ArrayList<BluetoothDevice>();
        mInflator = LayoutInflater.from(context);
    }

    public void addDevice(BluetoothDevice device) {
        if (mLeDevices != null && device.getName() != null) {
            // if (!mLeDevices.contains(device)) {
            // mLeDevices.add(device);
            // }
            if (mLeDevices != null && device.getName() != null) {
                if (!mLeDevices.contains(device) && ((device.getName().contains("wb")) || (device.getName().contains("Wb")))) {
                    mLeDevices.add(device);
                }
            }
        }
    }

    public ArrayList<BluetoothDevice> getDevice() {
        return mLeDevices;
    }

    public BluetoothDevice getDevice(int position) {
        return mLeDevices.get(position);
    }

    public void removeDevice(int position) {
        mLeDevices.remove(position);
        this.notifyDataSetChanged();
    }

    public void clear() {
        mLeDevices.clear();
    }

    @Override
    public int getCount() {
        return mLeDevices.size();
    }

    @Override
    public Object getItem(int i) {
        return mLeDevices.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @SuppressLint("InflateParams")
    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        ViewHolder viewHolder;
        if (view == null) {
            view = mInflator.inflate(R.layout.item_bluetooth_device, null);
            viewHolder = new ViewHolder();
            viewHolder.deviceAddress = (TextView) view.findViewById(R.id.tv_device_address);
            viewHolder.deviceName = (TextView) view.findViewById(R.id.tv_device_name);
            view.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) view.getTag();
        }

        BluetoothDevice device = mLeDevices.get(i);
        String deviceName = device.getName();
//        try {
//            DeviceAlias deviceAlias = DBController.getDeviceAlias(device.getAddress());
//            if (deviceAlias != null) {
//                deviceName = deviceAlias.getAlias();
//            }
//        } catch (DbException e) {
//            e.printStackTrace();
//        }

        if (deviceName != null && deviceName.length() > 0)
            viewHolder.deviceName.setText(deviceName);
        else
            viewHolder.deviceName.setText("---");
        viewHolder.deviceAddress.setText(device.getAddress());

        return view;
    }

    static class ViewHolder {
        TextView deviceName;
        TextView deviceAddress;
    }
}

这里的item的布局就不贴了。就是简单的两个textView.

简单的就是这样了。由于在家没有设备可以扫,不能给大家看效果。

MVP不是很熟悉,请大家指出不对的地方。

共勉!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值