我有一个活动类(外部类),一个静态广播接收器类(内部静态类)和一个服务类。服务和活动与消息和处理程序进行通信。当触发服务正在监视的操作时,将调用广播接收器。完成后我想调用服务中的方法来删除从“items_to_be_processed_queue”处理的元素。为此,我想使用我在MainActivity中的方法,该方法向触发remove方法的服务发送消息(我在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方法放在广播接收器中,但我仍然有运行时间错误。提前感谢您的回答。
答案 0 :(得分:1)
案例0:
你永远不应该创建Activity
类的对象它会给你一个null
上下文。请看@Raghav Sood的回答Creating an object of Activity class
案例1:
您无法从内部静态类调用非静态方法。如果您想在removeItem
中拨打MyBroadcastReceiver
,请将其设为static
。因为看起来你没有使用任何不应该成为问题的实例变量。
答案 1 :(得分:0)
你无法创建这样的活动,因为Android正在处理Activity lifeCycle,因此它不会有任何好处。
我可以建议不同的方法..也许我错过了一些东西,因为我没有完全理解你的代码,但这是更多的架构问题和更少的代码
假设您以静态方式保存DataList ......在这种情况下,您也可以从Activity和From服务访问..您无法以您希望的方式访问活动。
class Utils {
private static List<Integer> myList;
static {
myList<Integer> = new Vector<Integer>();//Create new instance of vectore which is thread safe
}
public void getMyList()..;
public List<Integer> setMyList..;
}
通过这种方式,您可以直接访问您的数据结构,而不必在这些数据结构之间进行同步。
编辑:您可以添加要移除和添加的方法等。
可以使用Utils.getMeyList();//Or all other method you need
希望有意义..