[英]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.