簡體   English   中英

如何在Android中創建實例以調用服務類的活動方法?

[英]How to create an instance to call a method of an activity to a service class in 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中執行此操作時實際上發生了什么問題。

因此,如果有人幫助我發現問題並解決問題,那就太好了。

這是一個較差的解決方案,根據UI類的實例,您不能擁有廣播接收器。 如果需要通知UI接收器中發生的事件,則可以使用某些Rx總線或類似的解決方案,將事件推送到總線上,然后UI會訂閱該總線並對事件做出反應。

另一個選擇是將您的Activity聲明為singleInstance,然后通過開始意圖將有效負載傳遞給它,如果該活動已經在運行,則它將在onNewIntent收到。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM