2012-01-04 8 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

しかし、私は唯一取得しています:

パターンオンダウンロード

何が問題なのですか?

答えて

4

あなたは、単一のインスタンスプロパティに登録ダウンローダを保つ:あなたのコメントに基づいて

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); 

編集:

// Last call's downloadListener wins. 
public void registerDownloadListener(DownloadListener downloadListener) { 
    mDownloadListener = downloadListener; 
} 

は、登録された最後のものは、アクティビティのです。

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つのオブジェクトごとに3つの異なるDowmloadManagerを作成すると、すべてわかります。しかし、私はただ一つのDownloadManagerを持っていたい。それは可能かどうか? – drifter

+0

@drifter;各リスナーをリストに保存して登録します。ハンドラでは、リストを反復し、各リスナの 'onDownloaded'を呼び出します。編集を参照してください。 –

+0

この問題を解決するには、リスナーのリストでobserverパターンを使用する必要があります。これはそのような目的のためのアプローチですか? – drifter

1

コードでは、これはmDownloadListener.onDownloaded();を呼び出して実行されます。 DownloadManagerクラスにあります。

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

なぜ私とYOUクラスのonDownloadedメソッドを実行する必要があるのか​​わかりませんが、決して呼び出されません。リスナーのOnDownloadedメソッドのみが呼び出されます。

0

まずはリストを使用していないと思います。

public void registerDownloadListener(DownloadListener downloadListener) { 
     mDownloadListener = downloadListener; 
    } 
関連する問題