如何在Android中创建实例以调用服务类的活动方法?

时间:2019-06-27 19:04:12

标签: java android

在我的Android项目中,我有一个服务类,从那里我将值传递给片段的一个静态方法。

这是我的服务类-

的代码
    public class MyLocationService extends BroadcastReceiver {

        public static final String ACTION_PROCESS_UPDATE = "my package name";

        @Override
        public void onReceive(Context context, Intent intent) {

            if(intent != null) {
                final String action = intent.getAction();
                if(ACTION_PROCESS_UPDATE.equals(action)) {
                    LocationResult result = LocationResult.extractResult(intent);

                    if(result != null) {
                        Location location = result.getLastLocation();
                        String location_string = new StringBuilder(""+location.getLatitude())
                                                        .append("/")
                                                        .append(location.getLongitude())
                                                        .toString();

                        try {
                            HomeFragment.getInstance().updateLocationText(""+location.getLatitude(), ""+location.getLongitude());

                        } catch (Exception e) {
                            Toast.makeText(context, location_string, Toast.LENGTH_SHORT).show();
                            Log.e("##Error:", e+"");
                        }

                    }

                }
            }

        } 
}

在我的 HomeFragment 类中,我已像下面一样初始化了实例-

static HomeFragment instance;
    public static HomeFragment getInstance() {
        return instance;
    }

然后使用如下所示的服务类方法-

 public void updateLocationText(final String latitude, final String longitude) {

        getActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Log.e("#MY_LOCATION:", latitude+"/ "+longitude);
                databaseReference = FirebaseDatabase.getInstance().getReference("users");
                databaseReference.child(userEmail).child("latitude").setValue(latitude);
                databaseReference.child(userEmail).child("longitude").setValue(longitude);


            }
        });

    }

这些代码的工作原理与我在片段类中所做的完全一样。

现在,问题是- ----------------------------

我想在Activity类中做同样的工作。为此,我创建了如下实例-

 static AllUsersActivity instance;

    public static AllUsersActivity getInstance() {
        return instance;
    }

然后在服务类中,我调用了如下方法-

try {
AllUsersActivity.getInstance().updateLocationText3(""+location.getLatitude(), ""+location.getLongitude());
                    } catch (Exception e) {
                        Toast.makeText(context, location_string, Toast.LENGTH_SHORT).show();
                        Log.e("##Error:", e+"");
                    }

但是在这里,使用实例在Activity类中调用它,却得到了空指针异常。 我不明白为什么会发生这种情况,因为同一种工作在片段中进展顺利,但是在Activity中执行此操作实际上会发生什么问题。

因此,如果有人帮助我发现问题并解决问题,那就太好了。

1 个答案:

答案 0 :(得分:1)

这是一个较差的解决方案,根据UI类的实例,您不能安装广播接收器。如果您需要通知UI接收器中发生的事件,则可以使用某些Rx总线或类似的解决方案,将事件推送到总线上,然后UI会订阅该总线并对事件做出反应。

另一种选择是将您的活动声明为singleInstance,然后通过开始意图将有效负载传递给它,如果活动已经在运行,则将在onNewIntent中收到。