【问题标题】:Problems in trying to create a Instance in MainActivity from another class尝试从另一个类在 MainActivity 中创建实例时出现问题
【发布时间】:2016-03-02 12:07:33
【问题描述】:

应用(OBDII 阅读器应用)在尝试连接到设备时崩溃。我的 MainActivity 中有 BTHandler 类,现在 BTHandler btHandler = new BTHandler(); btHandler.btConnect(); 所在的位置,但有人告诉我应该创建一个类,然后在 MainActivity 中创建它的实例。

所以这段代码:

BluetoothAdapter mAdapter = BluetoothAdapter.getDefaultAdapter();
        UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");//AA:BB:CC:11:22:33");
        try {
            BluetoothSocket socket = device.createInsecureRfcommSocketToServiceRecord(uuid);
            socket.connect();
            Log.v("connect", "connect");
        }
        catch (IOException e) {
            e.printStackTrace();
            Log.v("exception","e");
        }

曾经在 MainActivity 中,但被我的大学告知它应该在另一个班级中帮助我。

MainActivity.java

public class MainActivity extends AppCompatActivity {
    private BluetoothAdapter mAdapter;
    Button b1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        b1 = (Button) findViewById(R.id.connect);
        mAdapter = BluetoothAdapter.getDefaultAdapter();
        //init();

        if (mAdapter == null) {
            Toast.makeText(getApplicationContext(), "Device does not Support Bluetooth", Toast.LENGTH_LONG).show();
            finish();
        } else {
            if (!mAdapter.isEnabled()) {
                Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                startActivityForResult(intent, 1);
            }
        }
    }

    public void onClick(View v) {
        int id = v.getId();
        switch (id) {
            case R.id.connect:
                onConnect(); //Operation
                Log.v("Log", "Pressed onClick");
                break;
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_CANCELED) {
            Toast.makeText(getApplicationContext(), "Bluetooth must be Enabled", Toast.LENGTH_SHORT).show();
            finish();
        }
    }



    private void onConnect() {
        ArrayList deviceStrs = new ArrayList();
        final ArrayList<String> devices = new ArrayList();

        BluetoothAdapter mAdapter = BluetoothAdapter.getDefaultAdapter();
        Set pairedDevices = mAdapter.getBondedDevices();
        if (pairedDevices.size() > 0) {
            for (Object device : pairedDevices) {
                BluetoothDevice bdevice = (BluetoothDevice) device;
                deviceStrs.add(bdevice.getName() + "\n" + bdevice.getAddress());
                devices.add(bdevice.getAddress());
            }
        }

        // show list
        final AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);

        ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.select_dialog_singlechoice,
                deviceStrs.toArray(new String[deviceStrs.size()]));

        alertDialog.setSingleChoiceItems(adapter, -1, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
                int position = ((AlertDialog) dialog).getListView().getCheckedItemPosition();
                String deviceAddress = devices.get(position);

                BTHandler btHandler = new BTHandler();
                btHandler.btConnect();

            }
        });


        alertDialog.setTitle("Paired devices");
        alertDialog.show();


    }
}

BTHandler.java

public class BTHandler {
final ArrayList<String> devices = new ArrayList();
BluetoothAdapter mAdapter;
BluetoothDevice device;
String deviceAddress;

public BTHandler(Context context, Handler handler) {
    mAdapter = BluetoothAdapter.getDefaultAdapter();
}

public void btConnect(String deviceAdress) {
    mAdapter = BluetoothAdapter.getDefaultAdapter();
    device = mAdapter.getRemoteDevice(deviceAddress);

    UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");//AA:BB:CC:11:22:33");
    try {
        BluetoothSocket socket = device.createInsecureRfcommSocketToServiceRecord(uuid);
        socket.connect();
        Log.v("connect", "connect");
    }
    catch (IOException e) {
        e.printStackTrace();
        Log.v("exception","e");
    }
}
}

Logcat:

Process: com.example.asabanov.powersupplytool, PID: 14113 java.lang.NullPointerException: Attempt to invoke virtual method 'android.bluetooth.BluetoothDevice android.bluetooth.BluetoothAdapter.getRemoteDevice(java.lang.String)' on a null object reference
at com.example.asabanov.powersupplytool.BTHandler.btConnect(BTHandler.java:19)
at com.example.asabanov.powersupplytool.MainActivity$1.onClick(MainActivity.java:93)
at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:1108)
at android.widget.AdapterView.performItemClick(AdapterView.java:310)
at android.widget.AbsListView.performItemClick(AbsListView.java:1214)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3139)
at android.widget.AbsListView$3.run(AbsListView.java:3981)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:168)
at android.app.ActivityThread.main(ActivityThread.java:5845)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687)

【问题讨论】:

  • 这是您声明的问题 BluetoothAdapter mAdapter;但从未在 BTHandler.java 中初始化它
  • 啊啊,明白了!我编辑了 OP,检查我是否做对了。因为我需要一个处理程序。 BTHandler btHandler = new BTHandler(); btHandler.btConnect(); 现在在BTHandler中说“(Context, Handler)”,在BTHandler中说“(String)”不能应用。

标签: java android bluetooth obd-ii


【解决方案1】:

你没有使用初始化mAdapter的构造函数,导致它是null所以NullPointerException

改变

BTHandler btHandler = new BTHandler();

BTHandler btHandler = new BTHandler(MainActivity.this, null); 

onClick 方法的警报对话框中。

注意:您没有使用第二个参数,所以null 不应该让您担心,或者您应该一起删除第二个参数。

更新 像这样创建BTHandler 实例

BTHandler btHandler = new BTHandler(MainActivity.this, new Handler() {
    public void handleMessage(Message msg) {
        String response = msg.getData().getString("message");
        // TODO: take your action here
    }
});

使用它在BTHandler 内发送消息。创建全局变量mHandler

Message msg = mHandler.obtainMessage();
Bundle b = new Bundle();
b.putString("message", "Hello");
msg.setData(b);
mHandler.sendMessage(msg);

像这样更改您的 BTHandler 构造函数

Handler mHandler;
public BTHandler(Context context, Handler handler) {
    mAdapter = BluetoothAdapter.getDefaultAdapter();
    mHandler = handler;
}

【讨论】:

  • 是的!这行得通,谢谢。你知道我怎样才能让第二个参数工作(btHandler.btConnect();)吗?
  • 抱歉我的无知,我应该如何使用BTHandler中的代码并创建一个全局变量mHandler
  • 已更新以添加更多上下文。当您需要从BTHandlerMainActitivy 发送一些消息时,应该使用第二个代码块。也许您应该发布一个新问题,请说明您为什么要使用处理程序以及出于什么目的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-27
  • 1970-01-01
  • 2015-12-20
  • 2018-02-13
  • 2019-09-11
  • 2016-08-25
  • 2018-11-02
相关资源
最近更新 更多