2016-02-25 86 views
3

我對使用服務有疑問。我有一個服務來初始化一個對象,將服務的一個實例傳遞給該對象是一種不好的做法,所以它可以用於該對象?一個簡化的對象應該是:Android服務及其引擎

public class MyService extends Service { 
    MyObject myObject = new MyObject(this); 


    ... 
} 

public MyObject { 
    private MyService myService; 

    public MyObject(MyService myService) { 
     this.myService = myService; 
    } 

    ... 
    private void exampleMethod() { 
     myService.method(); 
    } 
} 

您怎麼看?這是不好的做法嗎?我怎樣才能解決這個問題,而不通過服務的實例? 事實是,我想分解兩個類中的代碼,因爲這些特性是不同的,websocket從服務類連接,但通過websocket解析/發送事件的方法在第二個類中。我想這樣做是爲了避免讓一個類擁有2000行代碼,並且通過特性來分割代碼。該服務處理websocket連接,而另一個類處理其他功能。由於一切都是異步的,第二個類需要服務類的一個實例。例如:如果接收並解析錯誤(在第二個類上),則此第二個類必須調用服務類來更新其狀態並重新連接。

編輯: 我正在考慮實施以下方案:

public class MyService extends Service { 
    MyObject myObject = new MyObject() { 
      protected void onSuccess() { 
       ... 
      } 
    }; 


    ... 
} 

public abstract class MyObject { 


    public MyObject() { 
    } 

    protected abstract void onSuccess(); 

    ... 
    private void exampleMethod() { 
     ... 
     onSuccess() 
    } 
} 

我越去想它,更好的解決方案,我認爲它是。你怎麼看?

非常感謝您提前!

+0

您可以考慮存儲服務的WeakReference的在你的對象 – malrok44

+0

對象居住在某一個生活圈。我想這是活動。你的對象不能啓動或停止你參考活動。你爲什麼這麼做?我看到你執行什麼方法服務? –

+0

謝謝你的回答。該對象不是一個活動,是一個連接到websocket的引擎,所以當我從該套接字獲取響應(在MyObject中)時,我必須通知服務這些變化。但是,由於這不是活動/片段,因此我無法綁定到該服務。 – FVod

回答

0

這沒有任何意義。如果您需要將回調傳遞給dao(websocket控制器),我建議您使用接口。問題是你應該使用你的服務來實現你的websocket控制器。 請添加websocket代碼,以便我們可以提出更多更改。

編輯:

public interface onGetData { 

    public void onSuccess(Object response) // here you pass the obj type you need in your service 

    public void onError(Object error) // same, but if things fail 

    } 



public class MyService extends Service implements onGetData { 

    @Override 
    public void OnCreate() { 
     MyObject myObject = new MyObject(this); 
    } 

    @Override 
    public void onSuccess(Object response) { 
    } 

    @Override 
    public void onError(Object error) { 
    } 


} 


public MyObject { 
    private OnGetData onGetData ; 

    public MyObject(OnGetData onGetData) { 
    this.onGetData = onGetData; 
    } 

    private void onRequestSuccess(Object response) { 
    onGetData.onSuccess(response) 
    } 

    private void onRequestError(Object error) { 
    onGetData.onError(error) 
    } 
} 
+0

這應該被添加爲comment.not回答。 –

+0

當然,但我會在添加代碼時進行編輯。 – sagits

+0

謝謝你的回答。我編輯了更多信息。事實是,當第二個類解析並處理來自web套接字的響應時,例如,如果出現錯誤,那麼第二個類必須通知服務類才能更改當前狀態並重新連接。 – FVod