Android活动:定期更新来自同一数据源的两个活动文本

时间:2016-05-25 16:19:01

标签: android android-activity android-asynctask timertask

我有2项活动,i) MainActivity ii) FavoriteActivity 和非活动类 RadioService 。两个Activity都有相同的方法 - notifyShowBar(),它显示了 showbar.xml@layout 中定义的文本栏。

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

@Override
protected void onResume() {
    super.onResume();
    notifyShowBar();
}
public void notifyShowBar() {
....
    textView.setText(revs.getMeta());
....
}
.....

FavoriteActivity.java

public class FavoriteActivity extends AppCompatActivity implements View.OnClickListener {

@Override
protected void onResume() {
    super.onResume();
    notifyShowBar();
}
public void notifyShowBar() {
....
    textView.setText(revs.getMeta());
....
}
.....

现在,当一个活动调用RadioService时,它会创建一个timertask,然后定期从服务器获取信息,并在父活动中显示bar。因此,条形图每15秒显示一次更新信息。

private class ProgressTask extends AsyncTask<String, Void, Boolean> {

    @Override
    protected void onPostExecute(final Boolean success) {
            updateMeta();
            ....
    }

    public void updateMeta() {
    timerAsync = new Timer();
    timerTaskAsync = new TimerTask() {
        @Override
        public void run() {
                ((Activity)context).runOnUiThread(new Runnable() {
                @Override public void run() {
                    // get and set meta data here and then call createShowBar
                    createShowBar();
                }
            });
        }
    };
    timerAsync.schedule(timerTaskAsync, 0, 15000);
    }

    private void createShowBar() {
    if (RadioService.inwhich == 2) {
        ((FavoriteActivity) context).notifyShowBar();
    } else {
        ((MainActivity) context).notifyShowBar();
    }
    }
.....
}

问题是,如果我在MainActivity中执行一个调用RadioService的按钮,它会显示bar并定期更新。但是当我浏览到FavoriteActivity时,它会显示条形但不会定期更新。我怎样才能让这两项活动都成功?感谢。

3 个答案:

答案 0 :(得分:5)

可以使用简单的继承规则来完成。 使用扩展abstract BaseActivity的抽象方法notifyShowBar创建AppCompatActivity。 使用MainActivity&amp; FavoriteActivity作为BaseActivity的子类。 由于抽象规则,notifyShowBar方法必须在MainActivity&amp; FavoriteActivity,所以每当您在notifyShowBar中致电BaseActivity时,它都会在子类中调用相同的内容

答案 1 :(得分:1)

使用BroadcastReceiver。您可以使用意图过滤器注册一个,然后它将收到与sendBroadcast一起发送的意图。如果您只想在应用可见时进行更新,请注册接收方onStart并取消注册onStop

public class FavoriteActivity extends AppCompatActivity {
    private static final String ACTION_UPDATE = "Something unique";

    private static final IntentFilter FILTER = new IntentFilter(ACTION_UPDATE);

    private final BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            // do your thing
        }
    };

    @Override
    protected void onStart() {
        super.onStart();
        registerReceiver(receiver, FILTER);
    }

    @Override
    protected void onStop() {
        super.onStop();
        unregisterReceiver(receiver);
    }
}

使用

发送广播
Intent intent = new Intent(ACTION_UPDATE);
// add data to intent
sendBroadcast(intent);

另外,请以更安全的方式查看LocalBroadcastManager

答案 2 :(得分:0)

对于我的应用程序的类似问题,我使用的服务与活动+ Square's Otto bus无关。服务将各种事件发布到总线中,活动订阅此总线实例和事件类型并执行相应的操作。