为什么我的所有听众都没有注册?

时间:2012-01-04 19:25:27

标签: java android

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

这可能是什么问题?

3 个答案:

答案 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;
    }