Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 无法关闭输入流_Android_Sockets_Tcp_Inputstream - Fatal编程技术网

Android 无法关闭输入流

Android 无法关闭输入流,android,sockets,tcp,inputstream,Android,Sockets,Tcp,Inputstream,在这个应用程序中,我正在运行一个远程服务,其中我启动一个单独的线程来运行TCP连接。。。在应用程序退出时,我必须关闭输入流,为其提供线程中断并更改布尔值(stopBroadcastRequested)。。当线程块中满足这一点时,我将关闭inputstream,但实际上它并没有关闭。。。如果在正常线程执行期间在线程内手动给定instream.close,则输入流将按预期关闭。。但是在if(stopBroadcastRequested){block of code}中,它不起作用..有人能告诉我我犯

在这个应用程序中,我正在运行一个远程服务,其中我启动一个单独的线程来运行TCP连接。。。在应用程序退出时,我必须关闭输入流,为其提供线程中断并更改布尔值(stopBroadcastRequested)。。当线程块中满足这一点时,我将关闭inputstream,但实际上它并没有关闭。。。如果在正常线程执行期间在线程内手动给定instream.close,则输入流将按预期关闭。。但是在if(stopBroadcastRequested){block of code}中,它不起作用..有人能告诉我我犯了什么错误吗

public class BroadcastService extends Service {

    class Task implements Runnable{
    OutputStream outStream = null;
    InputStream inStream = null;

    @Override
    public void run() {
        while(!stopBroadcastRequested){
            Log.i(TAG, "Thread Task started");          
            try {
                isSocketOpen = broadCastComm.isAliveOrOpenSocket("192.168.43.2", 6000, 17, 0);

                if(isSocketOpen){
                    Log.d("SERVICE CLASS", "STARTED THREAD - Writing in output stream");

                    notificationMngr.cancelAll();
                    isShowingNotification = false;
                    outStream = broadCastComm.getCurrentOutputStream();
                    outStream.write(messageToBeSent);
                    if(Integer.valueOf(messageToBeSent[2]) != (byte)0xA0){
                        Log.e("REVERTING", "REVERTING");
                        messageToBeSent = mFormatter.formBroadCastMessage("GET_PERIPH_DATA");
                    }

                    Log.d("OUTPUT STREAM", "Message sent ->" + ByteArrayToString(messageToBeSent));
                }else{
                    connectivityStatusHandler.sendEmptyMessage(0);
                }

                Thread.sleep(3000L);

                if(isSocketOpen){

                }

            } catch (Throwable t) { 
                Log.e(TAG, "Failed to retrieve data in thread", t);
            }
            Log.d("SERVICE CLASS", "End of THREAD");

        }

        if(stopBroadcastRequested){
            Log.e("SERVICE", "STOPPED THREAD");
            try {
                Log.e("*****THREAD", "CLOSED INPUT STARTED");
                if(inStream != null)
                    inStream.close();

                Log.e("*****THREAD", "CLOSED INPUT CLOSED");
                outStream.flush();
                outStream.close();
                Log.e("*****THREAD", "CLOSED OUTPUT");
            } catch (Exception e) {
                Log.e("THREAD", "FAILED TO CLOSE STREAMS");
            }
        }
    }

    public synchronized void stopThread(){
        stopBroadcastRequested = true;
    }

}


@Override
public void onDestroy() {
    super.onDestroy();
    Log.e(TAG, "Service destroying");
    stopBroadcastRequested = true;
    serviceThread.interrupt();


    cleanNotifications();
    broadCastComm.clearConnections();
    //dbHandler.removeCallbacks(dbUpdater);
    try {
        dbHelper.cleanup();
    } catch (Exception e) {
        Log.e("SERVICE", "Failed to clear DB connections");
    }
}
}

只能使用close()一次。如果(inStream!=null{inStream.close();) 每次。

您都会在第行收到一个异常(InterruptedException)

这发生在您甚至还没有为流内变量赋值之前, 所以


从未执行。您无法关闭空套接字。

对不起,伙计们,问题是我没有正确解除绑定服务,这导致了所有这些问题…没有在tabactivity中使用正确的上下文解除绑定..必须使用getApplicationContext()代替…:)

Log.e(“服务”,“停止线程”);这一行实际执行了吗?是的..它被执行了..当我在这段时间内(buf.available()>0){}或在正常执行期间在这段时间外给出时,它会按预期关闭,…但在中断块中不工作..这是线程问题..像共享资源或其他东西…您调用
inStream.close()
有好几次。也许第一次拍摄关闭了它,你会看到后续的关闭失败。嗯……如果它关闭一次,那应该没问题……因为在服务器上它会关闭……嗯……当我放置断点并检查它是否工作时……我不确定为什么它需要延迟才能工作……嗯,如果你找不到解决方案,我认为将此代码放入AsyncTask会很好。我认为它目前应该会由于线程睡眠而导致某种中断异常?不,一点也不。这是一种包装器,用于以非常有效和用户友好的方式执行后台操作。有很多类似的教程:我也建议您要尝试删除Thread.sleep方法并检查问题是否可以复制HMMM…为什么不使用处理程序?猜测异步任务需要从UI线程启动..整个代码都在远程服务中运行..是否可建议?我现在不使用此…inStream=broadCastComm.getCurrentInputStream();
  ------LOG
05-30 19:28:03.878: ERROR/BroadcastService(20288): Failed to retrieve data in thread
05-30 19:28:03.878: ERROR/BroadcastService(20288): java.lang.InterruptedException
05-30 19:28:03.878: ERROR/BroadcastService(20288):     at java.lang.VMThread.sleep(Native Method)
05-30 19:28:03.878: ERROR/BroadcastService(20288):     at java.lang.Thread.sleep(Thread.java:1213)
05-30 19:28:03.878: ERROR/BroadcastService(20288):     at java.lang.Thread.sleep(Thread.java:1195)
05-30 19:28:03.878: ERROR/BroadcastService(20288):     at      com.RBEI.TTApp.BroadcastService$Task.run(BroadcastService.java:126)
05-30 19:28:03.878: ERROR/BroadcastService(20288):     at java.lang.Thread.run(Thread.java:1019)
05-30 19:28:03.878: DEBUG/SERVICE CLASS(20288): End of THREAD
05-30 19:28:03.878: ERROR/SERVICE(20288): STOPPED THREAD
05-30 19:28:03.878: ERROR/*****THREAD(20288): CLOSED INPUT STARTED
05-30 19:28:03.882: ERROR/*****THREAD(20288): CLOSED INPUT CLOSED
05-30 19:28:03.882: ERROR/*****THREAD(20288): CLOSED OUTPUT
Thread.sleep(3000L);
inStream = broadCastComm.getCurrentInputStream();