2010-07-13 26 views
0

我在Android的上下文中這樣做,但我的問題是理解Java。我對兩者都有些新鮮,所以希望我在這裏使用正確的術語。Java繼承,匿名內部類實例成員,Android回調方法

我有一些子類繼承/擴展我的超類(一個Android活動擴展名)稱爲SuperActivity。我還定義了另一個名爲Network的類(這是一個Android服務)。在我的超類中,我定義了一個匿名的內部類,它實現了一個名爲ServiceConnection的(Android)接口。該接口指定(因此我正在定義)將由Android系統調用的方法。我必須將該匿名實例,ServiceConnection實現的內部類傳遞給一個名爲bindService()的方法,以便稍後可以調用該匿名內部類中的方法。

正如我所提到的,我對定義匿名內部類的超類進行了子類化。匿名內部類中的方法必須在子類實例中設置一個實例變量;我需要設置的實例變量在這裏稱爲mNetwork。

在超:

public class SuperActivity extends Activity { 
    protected Network mNetwork; 

    protected ServiceConnection mConnection = new ServiceConnection() { 
     @Override 
     public void onServiceConnected(ComponentName name, IBinder service) { 
      mNetwork = ((Network.NetworkBinder)service).getService(); 
     } 
    } 

    void bindNetwork() { 
     bindService(new Intent(this, Network.class), mConnection, Context.BIND_AUTO_CREATE); 
    } 
} 

所以我創建我的子類,並調用其bindNetwork()方法。顯然,分配給mConnection的匿名內部類不是我的子類的實例成員,因爲在匿名內部類中定義的OnServiceConnected()方法被調用之後,被稱爲mNetwork的子類的實例成員爲null。另外,如果我把持有匿名內部類的mConnection變量並在其上調用getClass()。getName()或toString(),它將顯示自己是我的超類的內部類,而不是子類。

顯然我不理解有關Java繼承的一些東西。我想要有許多子類,每個子類都有自己的mNetwork變量,這些變量由匿名內部類中的方法設置。我不想將匿名內部類的定義切換到每個子類中。必須有一種方法。我究竟做錯了什麼?

+0

這可能是一個愚蠢的問題,但是當你對mNetwork進行賦值時,那麼getService()方法會返回一個對象嗎? – weiji 2010-07-13 08:46:00

+0

是的,它的確如此。問題是,當我一直期待它的時候,任務沒有發生。 – 2010-07-15 09:20:29

回答

0

有一種方法:

  1. 實現一個接口來訪問網絡領域(如NetworkProvider
  2. 提取匿名類到一個真正的類
  3. 傳遞NetworkProvider到ServiceConnection實施

下面是說明該方法的基本片段:

public interface NetworkProvider { 
    public void setNetwork(Network network); 
    public Network getNetwork(); 
} 

public class SuperActivity extends Activity implements NetworkProvider { 
    private Network mNetwork; 
    @Override public void setNetwork(Network network){this.mNetwork = network;} 
    @Override Network void getNetwork(){return mNetwork;} 

    protected ServiceConnection mConnection = new MyServiceConnection(this); 

    // more methods 
} 

public class MyServiceConnection implements ServiceConnection { // or 'extends' if it's a class 
    private NetworkProvider networkProvider; 
    public MyService(NetworkProvider networkProvider) {this.networkProvider = networkProvider;} 

    @Override 
    public void onServiceConnected(ComponentName name, IBinder service) { 
     networkProvider.setNetwork(((Network.NetworkBinder)service).getService()); 
    } 
}