Como evitar que o tempo limite de candidatura?
-
19-08-2019 - |
Pergunta
Eu criei um aplicativo com vários segmentos, mas ainda trava se o servidor não está disponível.
Na atividade principal Eu criei os seguintes métodos:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//bind GUI elements
...
//start TCPConnection Service in a new thread
establishTCPConnection();
...
}
private void establishTCPConnection(){
TCPClientServiceThread = new Thread(null, backgroundConnection, "connection");
TCPClientServiceThread.start();
}
..
private Runnable backgroundConnection = new Runnable(){
public void run(){
//establish TCP connection
doEstablishTCPConnection();
}
};
private void doEstablishTCPConnection()
{
//start TCPConnection service
startService(new Intent(this, TCPClientService.class));
}
E esta é a classe TCPClientService:
public class TCPClientService extends Service{
...
private String serverAddress = "192.168.1.5";
private int portNumber = 1000;
@Override
public void onCreate()
{
//TODO: Actions to perform when service is created
connectionAvailable = false;
IntentFilter dataReceiverFilter;
dataReceiverFilter = new IntentFilter(MotranetClient.MOTION_DATA_UPDATED);
dataReceiver = new DataReceiver();
registerReceiver(dataReceiver, dataReceiverFilter);
EstablishConnection();
}
@Override
public IBinder onBind(Intent intent)
{
//TODO: Replace with service binding implementation
return null;
}
private void EstablishConnection()
{
try {
InetAddress serverAddr = InetAddress.getByName(serverAddress);
Log.d("TCP", "C: Connecting...");
Socket socket = new Socket(serverAddr, portNumber);
String message = "testing connection";
try {
Log.d("TCP", "C: Sending: '" + message + "'");
PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
out.println(message);
Log.d("TCP", "C: Sent.");
Log.d("TCP", "C: Done.");
connectionAvailable = true;
} catch(Exception e) {
Log.e("TCP", "S: Error", e);
connectionAvailable = false;
} finally {
socket.close();
announceNetworkAvailability(connectionAvailable);
}
} catch (Exception e) {
Log.e("TCP", "C: Error", e);
announceNetworkAvailability(connectionAvailable);
}
}
}
Quando o servidor não está disponível a linha
Socket socket = new Socket(serverAddr, portNumber);
faz com algum atraso e eu acredito que esta é a causa para pendurar. Mas, se o Serviço TCPClientService estiver executando em sua própria thread eu não sei por que isso afeta o tempo limite da atividade principal.
Eu ficaria muito grato se alguém pudesse mostrar como evitar a aplicação a partir de suspensão quando o servidor não está disponível.
Solução
runs a plataforma Android -always- ciclo de vida métodos para Activitys e serviços no segmento de eventos principal. Assim você cria outro segmento, e chamar StartService dele ... mas quando o serviço é criado e iniciado o onCreate () etc métodos estão sendo chamados a partir do segmento de eventos principal, -not- do seu segmento do usuário.
A maneira correta de fazer isso é para não chamar StartService de outro segmento, mas para chamar StartService normalmente, e depois ter o Serviço de gerar um segmento de conexão de dentro onCreate ().
A solução da ssakl não resolve o problema básico que eu estou com medo.