如何编写自定义侦听器来检查下载过程是否已结束?

时间:2011-09-03 22:07:30

标签: android events listener

我正在开发一款从互联网上下载一些信息的应用。在应用程序开始时,会出现一个对话框,询问用户是否要下载该信息。如果他这样做,它将开始下载过程(在另一个线程中)。

这是代码:

的活动:

public void onCreate(Bundle savedInstanceState) 
{     
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // Initialize preferences
    settings = PreferenceManager.getDefaultSharedPreferences(this);

    // Start Database
    db.open();
    db.close();

    /**Check for updates**/
    checkForDBUpdates(settings.getInt("db_version", 0));
}

private void checkForDBUpdates(int Version)
{
    // Check if Internet connection is available
    boolean online = isOnline();

    if (online) 
    {
        final UpdateNDGS update = new UpdateNDGS(this, Version);

        boolean update_status = update.check();

        if (update_status)
        {
            System.out.println("READY TO UPDATE!");

            Command updateCommand = new Command() 
            {
                public void execute() 
                {
                    update.getUpdate();
                    update.database();
                    //Download Complete, show list
                                    startNormasList();
                }
            };
            AlertDialog updateDialog = createUpdateDialog(this, updateCommand);
            updateDialog.show();
        }
        else
        {
            //Nothing to download, show list
            startNormasList();
        }
    }
    else
    {
        //offline, show list
        startNormasList();
    }
}

一切都在起作用,但如果我希望将来添加功能,它可能会变得混乱。

所以我的问题是: 我该如何改进这段代码?

在下载过程完成或从未发生时,添加一个触发事件“show list”的侦听器会不会更好?

我该怎么办?我一直在阅读,但找不到任何有用的东西。

3 个答案:

答案 0 :(得分:6)

拥有侦听器是为代码添加可扩展性以及解耦事件和处理程序的好方法。以下是您需要采取的步骤:

  • 确定在触发事件的情况下侦听器应实现的接口。这包括在触发“show list”事件的情况下需要传递回侦听器的参数。类似的东西(我不知道你需要的参数,所以这是非常通用的结构)

    public interface ShowListEventLisener {
        public void onShowList(Object... params);
    }

  • 在发生事件的类中,添加一个方法来注册/添加事件的侦听器。请注意,这可以是一组侦听器,也可以只是一个。以下代码说明仅添加一个侦听器

    public void setOnShowListListener(ShowListEventLisener showListListener) {
       this.showListListener = showListListener;
    }

如果您需要“show list”事件

的不同行为,这将允许您增加灵活性
  • 现在您只需要在适当的时候触发事件。您可以通过下载代码中的以下代码实现此类似

   if( isDownloadFinished) {
       // call the listeners with the parameters that you need to pass back
       this.showListListener.onShowList(paramsThatYouNeed);
   }

请注意,由于您在不同的线程中执行下载,因此您可能希望在触发事件之前使用Handler / AsyncTask。上面的示例是一般化的,但应该足以让您遵循以构建自己的自定义侦听器。

答案 1 :(得分:2)

您可以使用Handler来表示您的用户界面。

我认为this guide很简单。

答案 2 :(得分:2)

请参阅

  1. DownloadManager,处理下载过程和标准通知
  2. 在API级别9之前,我通常使用AsyncTask并处理相应方法中的所有通知
  3. 我希望是你想要的