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

标签 android inner-classes static-classes

我有一个 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/

相关文章:

c++ - 嵌套模板类特化的语法

c# - 这种强制不变性的模式有什么缺点?

Javaparser 从内部/嵌套类定义中收集多个孤立且未附加的注释

android - 带拖放禁用的 viewpager

java - C# 的 goto 语句在 Java 中的等价物是什么?

java - 使用 Sinch 即时通讯系统

php - 具有静态类的适配器模式

android - 测试手机是否root

java - 音频可以在静态嵌套类中实现吗?

java - 重写静态内部类的静态方法时出现 Stackoverflow 错误