如何在运行更新视图的后台服务时访问Activity的View对象

时间:2019-04-27 06:23:54

标签: java android android-activity static

我有一个具有互联网连接服务的android应用。每当应用程序联机或脱机时,该服务都会显示一个小吃栏。 服务运行良好,但是访问MainActivity的快餐栏或显示快餐栏的相对布局时,我会得到空值。下面是后台服务回调的实现,此方法写在mainactivity内:

  public void hasInternetConnection() {
    if (!hasInternetMessageShown) {
        showSnackBar("App is online", false);
    }      
}
private void showSnackBar(String message, boolean shouldStick) {
    if (snack != null && snack.isShown()) {
        snack.dismiss();
    }
    snack = Snackbar.make(rootView, message, Snackbar.LENGTH_SHORT);
    snack.getView().setBackgroundColor(activity.getResources().getColor(R.color.blue_light));
    TextView textView = snack.getView().findViewById(android.support.design.R.id.snackbar_text);
    textView.setTextColor(activity.getResources().getColor(R.color.orange));
    Typeface typeface = ResourcesCompat.getFont(activity, R.font.semibold);
    textView.setTypeface(typeface, Typeface.NORMAL);
    if (shouldStick)
        snack.setDuration(BaseTransientBottomBar.LENGTH_INDEFINITE);
    snack.show();
}

以上代码仅在我将点心和活动实例保持静态的情况下有效。我不想这样做,因为它会触发内存泄漏。请在这里帮助我,以便我可以有效地处理此问题。

谢谢!

2 个答案:

答案 0 :(得分:2)

请尝试通过您的服务发送有关活动的本地广播,然后尝试更新小吃店。

答案 1 :(得分:2)

public class UpdaterApplication extends Application {
  public void onCreate() {
    super.onCreate();
    Thread thread = new Thread(new Runnable() {
      @Override
      public void run() {
        loadDataFromServer();
      }});
    thread.start();
  }

  private void loadDataFromServer() {
    // ...
    // load data from server
    // this could take some time
    // ...

    // How do we update the current activity?

  }
}

请注意,我们必须添加该行

android:name="UpdaterApplication"