Java 如何创建一个实例来调用Android中服务类的活动方法?

Java 如何创建一个实例来调用Android中服务类的活动方法?,java,android,Java,Android,在我的Android项目中,我有一个服务类,从中我将值传递给片段的一个静态方法 这是我的服务类代码- 在我的HomeFragment类中,我初始化了如下实例- static HomeFragment instance; public static HomeFragment getInstance() { return instance; } public void updateLocationText(final String latitude, final

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

这是我的服务类代码-

在我的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);


            }
        });

    }
 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+"");
                    }
然后对服务类使用如下方法-

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);


            }
        });

    }
 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+"");
                    }
这些代码的工作方式与我在fragment类中的工作方式完全相同

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

我想在我的活动课上做同样的工作。为此,我创建了如下实例-

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);


            }
        });

    }
 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+"");
                    }
然后在服务类中,我调用了如下方法-

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);


            }
        });

    }
 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+"");
                    }
但在这里,使用实例在活动类中调用它,它会得到null指针异常。 我不明白为什么会发生这样的事情,因为同样的工作在片段中进行得很好,但在活动中这样做时实际发生了什么问题


因此,如果有人帮助我找到问题并解决它,那将是非常好的。

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

另一个选项是将您的活动声明为singleInstance,然后通过start intent将有效负载传递给它,如果活动已在运行,则会在onNewIntent中接收到该启动意图。

try eventbushttps://github.com/greenrobot/EventBus 从活动或片段中接收的服务