我正在开发一个从互联网下载一些信息的应用程序。在应用程序的开头,会出现一个对话框,询问用户是否希望下载该信息。如果他这样做,它会开始下载过程(在不同的线程中)。
这是代码:
Activity :
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();
}
}
实际上一切正常,但如果我想在未来添加功能,它可能会变得困惑。
所以我的问题是: 我该如何改进这段代码?
添加一个在下载过程完成或从未发生时触发事件“显示列表”的监听器不是更好吗?
我该怎么做?我读了很多书,但找不到任何有用的东西。
最佳答案
拥有监听器是为您的代码添加可扩展性以及解耦事件和处理程序的好方法。以下是实现该目标所需执行的步骤:
- 决定事件触发时监听器应该实现的接口(interface)。这包括在触发“显示列表”事件的情况下需要传回给监听器的参数。类似的东西(我不知道你需要的参数,所以这是非常通用的结构)
public interface ShowListEventLisener {
public void onShowList(Object... params);
}
- 在事件发生的类中,添加一个方法来注册/添加事件的监听器。请注意,这可能是一组监听器,也可能只是一个。以下代码说明仅添加一个监听器
public void setOnShowListListener(ShowListEventLisener showListListener) {
this.showListListener = showListListener;
}
如果您需要“显示列表”事件的不同行为,这将允许您增加灵 active
- 现在您只需要在适当的时候触发事件。您可以通过执行下载的代码实现类似于以下代码
if( isDownloadFinished) {
// call the listeners with the parameters that you need to pass back
this.showListListener.onShowList(paramsThatYouNeed);
}
请注意,由于您在不同的线程中执行下载,因此您可能希望在触发事件之前使用 Handler/AsyncTask。上面的示例是通用的,但应该足以让您遵循以构建自己的自定义监听器。
关于android - 如何编写自定义监听器以检查下载过程是否已结束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7296143/