android - 从 BroadcastReceiver 更新 fragment 的 TextView

标签 android android-fragments broadcastreceiver android-service

我想在我的主 fragment 中使用用户的当前位置设置 TextView 的文本。该位置通过 FusedLocationApi 在服务中获得。服务正常运行,我可以在 toast 消息中看到位置更新。 我尝试设置此位置,但收到 NullPointerEx。调试后,我看到 BroadcastReceiver 的部分永远不会被调用。 下面是我使用的代码。
主 fragment .java

 @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mIntent = new Intent(getContext(), MyService.class);
    getActivity().startService(mIntent);
    getActivity().registerReceiver(broadcastReceiver, new IntentFilter(MyService.BROADCAST_ACTION));
}  
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        try {
            updateUI(intent);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
};
 private void updateUI(Intent intent) throws IOException {
    latitudeString = intent.getStringExtra("latitude");
    longitudeString = intent.getStringExtra("longitude");
    myTime = intent.getStringExtra("time");
}
 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        return null;
    }
    View view = inflater.inflate(R.layout.fragment_main, null);

    googleMap = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map)).getMap();

    saveAdress = (Button) view.findViewById(R.id.buttonSaveAdress);
    getBack = (Button) view.findViewById(R.id.buttonGetBack);

    latitude = Double.parseDouble(latitudeString); //Null pointer here from latitudeString
    longitude = Double.parseDouble(longitudeString);
    LatLng latLng = new LatLng(latitude, longitude);
    googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
    googleMap.animateCamera(CameraUpdateFactory.zoomTo(15));
    googleMap.setMyLocationEnabled(true);
...}

部分MyService.java(fusedLocationApi代码除外)

private static final String TAG2 = "MyService";
public static final String BROADCAST_ACTION = "package.where.is.myService.displayevent";
private final Handler handler = new Handler();
Intent intent;
@Override
public void onCreate() {
    super.onCreate();
    intent = new Intent(BROADCAST_ACTION);
    handler.removeCallbacks(sendUpdatesToUI);
    handler.postDelayed(sendUpdatesToUI, 1000); // 1 second
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}


@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d("LOC", "Service init...");
    isEnded = false;
    mRequestingLocationUpdates = false;
    mLastUpdateTime = "";
    buildGoogleApiClient();
    if (mGoogleApiClient.isConnected() && mRequestingLocationUpdates) {
        startLocationUpdates();
    }
    return Service.START_REDELIVER_INTENT;
}


@Override
public void onConnected(Bundle bundle) {
    startLocationUpdates();
}

@Override
public void onDestroy() {
    super.onDestroy();
    stopLocationUpdates();
}
private Runnable sendUpdatesToUI = new Runnable() {
    public void run() {
        DisplayLoggingInfo();
        handler.postDelayed(this, 5000); // 5 seconds
    }
};
private void DisplayLoggingInfo() {
    Log.d(TAG2, "entered DisplayLoggingInfo");

    intent.putExtra("latitude", mCurrentLocation.getLatitude());
    intent.putExtra("longitude",mCurrentLocation.getLongitude());
    intent.putExtra("time", mCurrentLocation.getTime());

    Log.d(TAG2, String.valueOf(mCurrentLocation.getLatitude()));

    //intent.putExtra("counter", String.valueOf(++counter));
    sendBroadcast(intent);
}

最佳答案

BroadcastReceiver 不是这里的最佳选择 - 考虑改用 EventBus

关于android - 从 BroadcastReceiver 更新 fragment 的 TextView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38121296/

相关文章:

java - Android - 语音解锁手机

android - 如何为 Android 平板电脑布局实现固定左 Pane ?

Android-Broadcast Receiver 和 Intent Filter

android - fragment 中的 getContext()

android - 在 Android 应用程序组件之间共享数据的最佳方式

安卓应用更新广播

Android WebView 未正确加载

android - 将文件从 SD 卡的文件夹复制到 SD 卡的另一个文件夹

安卓 Galaxy Tab : Why is the launch icon surrounded by a pink border?

android - 如何转到 fragment 中 Webview 中的上一页?