从BroadcastReceiver更新适配器

时间:2014-01-17 23:12:36

标签: android android-fragments broadcastreceiver android-fragmentactivity fragmentpageradapter

我正在为我正在撰写的应用程序提供一些帮助。

我有一个简单的同步,它应该从服务器获取数据并将其更新/插入数据库。

通过使用AlarmManager设置的BroadcastReceiver进行同步,每天运行一次。这工作正常,我可以在应用程序运行/未运行时获取数据并将其更新/插入数据库中,无关紧要。

我遇到的问题是应用程序打开时 - 用于显示我的碎片的适配器无法更新(或者我不知道如何更新)。我需要更新适配器,以便我可以刷新FragmentActivity中的Fragments。

欢迎任何帮助,到目前为止我失去了几个小时,无法弄明白。谢谢!

2 个答案:

答案 0 :(得分:1)

在您的适配器的片段或活动中,您可以在onNewIntent调用中侦听广播接收器的意图,并将新数据放入您的arrayList或您使用的容器中,然后只需在您的适配器上调用notifyDataSetChanged。 / p>

编辑:

您需要做的只是在您的接收器中启动意图并通过意图将新数据传递到您的活动中。确保将您的活动设置为单个实例,以便不打开它的新实例。您可能还需要设置另一个标志,但我不记得我的头脑。

答案 1 :(得分:1)

我解决了我遇到的问题 - BroadcastReceiver和Timer如此:

Calendar c = Calendar.getInstance(TimeZone.getDefault());
Intent i = new Intent(this, CardBroadcastReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);
AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis() + 4000, 20000, pi);

Timer timer = new Timer();

timer.scheduleAtFixedRate(new TimerTask() {
    public void run() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                 if(isRunning)
                 {
                     Log.i("ZEUS_REFRESHING_DATA", "NOW");
                     loadCards();
                 }
            }
        });
    }
}, 0, 10000);

loadCards()方法执行以下操作:

public void loadCards()
{
    MyDbHandler db = new MyDbHandler(this);

    cards = db.getAllCards();
    this.cardCount = db.getCountCards();

    // Create the adapter that will return a fragment for each of the three
    // primary sections of the app.
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager(), this);
    if(this.cardCount > 0)
    {
        mSectionsPagerAdapter.setCount(this.cardCount);
        mSectionsPagerAdapter.notifyDataSetChanged();

    }
    // Set up the ViewPager with the sections adapter.
    mViewPager.setAdapter(mSectionsPagerAdapter);
}

所以基本上只需重新加载适配器。

所以现在我可以在应用程序处于后台或不使用BroadcastReceiver运行时重新加载卡片,当应用程序处于活动状态或前台时,我只需使用计时器重新加载数据!

就是这样!