Witam, mam pytanie dotyczące architektury. Mam Klase ClientModel w którym tworze instancje Menager która zajmuję sie odtwarzaniem muzyki , pobieraniem muzyki (Klasa connect).
W momencie gdy chce pobrać np liste utworów z serwera pobieram instancje getInstance() z Klasy connect która implementuje Runnable.
public class Menager {
//Client Model
ClientModel clientModel;
// Connection to server
Connect connect;
AdvancedPlayer advancedPlayer;
LinkedList<Song> songList = new LinkedList<>();
Song song;
public Menager()
{
}
public void initialization()
{
connect= Connect.getInstance();
}
public void setClientModel(ClientModel clientModel) {
this.clientModel = clientModel;
}
private void getSongsList()
{
connect.getSongsList();
}
}
public class Connect implements Runnable{
static Connect connect;
Socket connection ;
String address ="127.0.0.1";
int port =55555;
Thread th;
InputStream inputStream;
OutputStream outputStream;
String query;
private Connect()
{
}
public static Connect getInstance()
{
if(connect ==null)
{
connect = new Connect();
}
return connect;
}
private void initialization(){
connection= new Socket();
}
public LinkedList<Song> getSongList()
{
query="GetSongsList";
Request();
while(th.isAlive()); // Tutaj.
return songList;
}
private void Request()
{
th = new Thread(this);
th.start();
}
private void ConnectToServer()
{
try{
TimeUnit.SECONDS.sleep(1);
connection = new Socket(address,port);
} catch (IOException e)
{
System.out.println("Server is not able");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while(!connection.isConnected())
{
ConnectToServer();
}
if(connection.isConnected())
{
System.out.println("You are Connected");
try {
inputstream =connection.getInputStream(); // Tutaj wyśle tego query
outputstream = connection.getOutputStream(); // Pobierze dane ze serwera
}catch (IOException e)
{
System.out.println(e);
}
}
}
}
Tutaj pojawia się problem, Menager wywołuje tą metodę
Ta metoda tworzy nowy wątek który łączy się z serwerem
pobiera obiekty(To dopiero dopisze) i dodaje do songList uzyskane dane.
- Strasznie ten While kluje mnie w oczy bo w sumie Menager musi czekać aż
connect uzyska dane ze serwera , Czy jest jakaś możliwość inaczej to rozwiązać
zamiast th.isAlive wiem że mogę dać boolean kiedy wątek będzie miał gotową odpowiedz. - Co w sytuacji gdy bym chciał mieć wiele rodzajów zapytań(Wiele metod typu getSongList) ? Jak tworzyć taką architekturę klas ,metod.
- Jakieś porady projektowe, w jaki sposób zaprojektować taką aplikacje (mam tu na myśli klasy , referencje, metody) zanim usiądzie się do pisania
Najbardziej cenne porady -> Programowanie zgodne ze Sztuką