簡體   English   中英

預定任務和Android UI

[英]Scheduled Task and Android UI

我想定期更新ListActivity中的ListView。 我知道我可以使用AsyncTask子類輕松完成此操作,但出於興趣,我認為我會考慮使用ScheduledThreadPoolExecutor和android.app.Activity.runOnUiThread(Runnable action)方法。

我發布我可能有一個'高級時刻',但問題是我似乎只能通過嵌套runnable來使它工作,因為ScheduledThreadPoolExecutor.scheduleAtFixedRate和runOnUiThread都需要Runnable作為參數。

這是我的工作代碼:

private void setUpPageUpdater()
{
    listUpdaterExecuter = new ScheduledThreadPoolExecutor(NUM_LIST_UPDATER_THREADS);
    listUpdaterExecuter.scheduleAtFixedRate(new PageUpdater1(), 5, 5, TimeUnit.SECONDS);
}

class PageUpdater1 implements Runnable
{
    @Override
    public void run()
    {
        runOnUiThread(new PageUpdater2());
    }
}

class PageUpdater2 implements Runnable
{
    @Override
    public void run()
    {
        updateList();
    }
}

    private synchronized void updateList()
{
    pages.clear();
    pages.addAll(RetrievedPageProvider.getInstance().getPages());
    sortList();
    adapter.notifyDataSetChanged();
}

有沒有更好的方法來編碼?

提前致謝。

提示 :您不需要同步updateList 無論如何,它都在一個線程上執行。

匿名實例示例:

private void setUpPageUpdater() {
    listUpdaterExecuter = new ScheduledThreadPoolExecutor(NUM_LIST_UPDATER_THREADS);
    listUpdaterExecuter.scheduleAtFixedRate(new Runnable() {
        private Runnable update = new Runnable() {
            @Override
            public void run() {
                updateList();
            }
        };

        @Override
        public void run() {
            runOnUiThread(update);
        }
    }, 5, 5, TimeUnit.SECONDS);
}

好的,有更好的方法來做到這一點。 假設您正在使用CursorAdpater在ListView中顯示內容。 然后,每次更新數據集時,您都可以調用notifyChange (從任何線程),所有在要更新的特定URI上具有光標的CursorAdapters都會更新它們顯示的內容。

我知道您可能沒有使用CrusorAdapter。 但是對於您使用的任何適配器實現,都應該有一種同義的方式來執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM