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

Tiv*_*vie 2 events android 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

一切都在实际工作,但如果我希望将来添加功能,它可能会变得混乱.

所以我的问题是:如何改进此代码?

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

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

mom*_*omo 6

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

  • 确定在触发事件的情况下侦听器应实现的接口.这包括在触发"show list"事件的情况下需要传递回侦听器的参数.有点像(我不知道你需要的参数,所以这是非常概括的结构)

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

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

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

Run Code Online (Sandbox Code Playgroud)

如果您需要"show list"事件的不同行为,这将允许您添加灵活性

  • 现在您只需要在适当的时间触发事件.您可以通过下载代码中的以下代码实现此类似功能

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

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