2012-01-04 36 views
0
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

PATTERNSActivity onDownloaded

但我只得到:

PATTERNSActivity onDownloaded

这是什么问题?

回答

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; 
} 
+0

我知道,如果我创建3个不同的DowmloadManager的每3个对象正在侦听下载状态 - 一切正常。但我想只有一个DownloadManager。有没有可能? – drifter 2012-01-04 19:36:49

+0

@drifter当然;通过将每个监听器保存在列表中来注册。在处理程序中迭代列表,调用每个监听器的'onDownloaded'。请参阅编辑。 – 2012-01-04 19:38:44

+0

所以我需要使用观察者模式和听众列表来解决这个问题。这只是这种目的的方法吗? – drifter 2012-01-04 19:42:18

1

在你的代码中,这通过调用mDownloadListener.onDownloaded()来执行。在DownloadManager类中。

@Override 
public void onDownloaded() { 
    Log.e("TAG","PATTERNSActivity onDownloaded"); 
} 

在不明白为什么我和你类的onDownloaded方法应该被执行,他们从来不叫。只调用Listener的OnDownloaded方法。

0

对于初学者,我认为你没有使用一个列表。你只覆盖该值,所以你总是会得到最后一个:

public void registerDownloadListener(DownloadListener downloadListener) { 
     mDownloadListener = downloadListener; 
    }