Android:从内部静态类调用外部类的方法

时间:2014-05-29 10:50:02

标签: android inner-classes static-classes

我有一个活动类(外部类),一个静态广播接收器类(内部静态类)和一个服务类。服务和活动与消息和处理程序进行通信。当触发服务正在监视的操作时,将调用广播接收器。完成后我想调用服务中的方法来删除从“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方法放在广播接收器中,但我仍然有运行时间错误。提前感谢您的回答。

2 个答案:

答案 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

希望有意义..