質問

マルチスレッドアプリケーションを作成しましたが、サーバーが利用できない場合でもハングします。

メインアクティビティでは、次のメソッドを作成しました。

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

そして、これは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);
         }
    }


}

サーバーが利用できない場合、次の行

Socket socket = new Socket(serverAddr, portNumber);

遅延が発生し、これがハングの原因であると思います。ただし、TCPClientServiceサービスが独自のスレッドで実行されている場合、これがメインアクティビティのタイムアウトに影響する理由はわかりません。

サーバーが利用できないときにアプリケーションがハングするのを防ぐ方法を誰かが示すことができたら、とてもありがたいです。

役に立ちましたか?

解決

Androidプラットフォームは、常にメインイベントスレッドでアクティビティとサービスのライフサイクルメソッドを実行します。したがって、別のスレッドを作成し、そこからstartServiceを呼び出しますが、サービスが作成されて開始されると、ユーザースレッドではなくメインイベントスレッドからonCreate()などのメソッドが呼び出されます。

これを行う適切な方法は、別のスレッドからstartServiceを呼び出すのではなく、通常どおりstartServiceを呼び出してから、サービスにonCreate()内から接続スレッドを生成させることです。

ssaklのソリューションは、私が恐れている基本的な問題に対処していません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top