public interface DownloadListener {
public void onDownloaded();
}
public class DownloadManager {
private static DownloadManager instance;
private DownloadListener mDownloadListener;
public static synchronized DownloadManager getInstance(){
if(instance == null)
instance = new DownloadManager();
return instance;
}
private DownloadManager() {
myHandler.sendEmptyMessageDelayed(29, 3 * 1000);
}
public void registerDownloadListener(DownloadListener downloadListener) {
mDownloadListener = downloadListener;
}
Handler myHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
if (msg.what == 29) {
mDownloadListener.onDownloaded();
return true;
}
return false;
}
});
}
public class I implements DownloadListener {
public I() {
DownloadManager.getInstance().registerDownloadListener(this);
}
@Override
public void onDownloaded() {
Log.e("TAG", "I onDownloaded");
}
}
public class You implements DownloadListener {
public You() {
DownloadManager.getInstance().registerDownloadListener(this);
}
@Override
public void onDownloaded() {
Log.e("TAG", "You onDownloaded");
}
}
public class PATTERNSActivity extends Activity implements DownloadListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
new I();
new You();
DownloadManager.getInstance().registerDownloadListener(this);
}
@Override
public void onDownloaded() {
Log.e("TAG","PATTERNSActivity onDownloaded");
}
}
我期待得到:
我onDownloaded
你onDownloaded
PATDNSActivity onDownloaded
但我只得到:
PATDNSActivity onDownloaded
这可能是什么问题?
答案 0 :(得分:4)
您将注册的下载程序保存在单个实例属性中:
// Last call's downloadListener wins.
public void registerDownloadListener(DownloadListener downloadListener) {
mDownloadListener = downloadListener;
}
注册的最后一个是活动:
new I(); // First set singleton's property to an instance of I...
new You(); // ...then to an instance of You...
// ...then to the current instance.
DownloadManager.getInstance().registerDownloadListener(this);
根据您的评论进行修改。
public void registerDownloadListener(DownloadListener downloadListener) {
mDownloadListeners.add(downloadListener);
}
...
public boolean handleMessage(Message msg) {
if (msg.what != 29) {
return false;
}
for (DownloadListener listener : mDownloadListeners) {
listener.onDownloaded();
}
return true;
}
答案 1 :(得分:1)
在你的代码中,这是通过调用mDownloadListener.onDownloaded()来执行的。在DownloadManager类中。
@Override
public void onDownloaded() {
Log.e("TAG","PATTERNSActivity onDownloaded");
}
在不明白为什么应该执行I和YOU类的onDownloaded方法时,它们永远不会被调用。只调用监听器的OnDownloaded方法。
答案 2 :(得分:0)
对于初学者,我认为你没有使用列表。你只需覆盖这个值,这样你就可以得到最后一个:
public void registerDownloadListener(DownloadListener downloadListener) {
mDownloadListener = downloadListener;
}