我有一个 Activity 类(外部类)、一个静态广播接收器类(内部静态类)和一个服务类。服务和 Activity 通过消息和处理程序进行通信。当触发服务正在监视的操作时,将调用 broadcastreceiver。完成后我想在服务中调用一个方法来删除从“items_to_be_processed_queue”中处理的元素。为此,我想使用我的 MainActivity 中的方法,该方法向触发删除方法的服务发送消息(我在 MainActivity 中有此方法,因为可以通过按下按钮从“items_to_be_processed_queue”中手动删除一个项目).问题是我不断收到两种错误,具体取决于我所做的(我将首先向您展示一些代码):
public class MainActivity extends Activity {
Messenger messenger;
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder binder) {
messenger = new Messenger(binder);
}
public void onServiceDisconnected(ComponentName className) {
messenger = null;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
....
}
//Button click implementation
public void removeItem(View view) {
Message msg = Message.obtain(null, MyService.REMOVE_ITEM);
msg.replyTo = new Messenger(new ResponseHandler());
Bundle b = new Bundle();
b.putInt("data", Integer.valueOf(etNumber.getText().toString()));
msg.setData(b);
try {
messenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
public void removeItem(int i) {
Message msg = Message.obtain(null, MyService.REMOVE_ITEM);
msg.replyTo = new Messenger(new ResponseHandler());
Bundle b = new Bundle();
b.putInt("data", i);
msg.setData(b);
try {
messenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
protected static class ResponseHandler extends Handler {
Boolean result;
@Override
public void handleMessage(Message msg) {
int respCode = msg.what;
switch(respCode) {
case MyService.ADD_ITEM: {
result = msg.getData().getBoolean("respData");
}
case MyService.REMOVE_ITEM: {
result = msg.getData().getBoolean("respData");
}
}
}
}
public static class MyBroadcastReceiver extends BroadcastReceiver {
.........
@Override
public void onReceive(Context context, Intent intent) {
........
Case 0: new MainActivity().removeItem(id); //Where id is the position of the item
Case 1: MainActivity.this.removeItem(id);
}
......
因此,在情况 0 中,我没有遇到编译错误,但在运行时,我在 removeItem(int i) 方法内的 messenger.send(msg) 处收到 NullPointerException。在案例 1 中,我收到编译错误“在范围内无法访问类型 MainActivity 的封闭实例”。 我做错了什么,我该怎么办?我什至尝试将 removeItem 方法放在 broadcastreceiver 中,但我仍然遇到运行时错误。预先感谢您的回答。
最佳答案
案例 0:
永远不要创建Activity
类的对象,它会给您一个null
上下文。在这里查看@Raghav Sood 的回答 Creating an object of Activity class
案例一:
您不能从内部静态类调用非静态方法。如果您想在 MyBroadcastReceiver
中调用 removeItem
,请将其设为 static
。因为看起来您没有使用任何不应该成为问题的实例变量。
关于Android:从她的内部静态类调用外部类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23931608/