Java RecyclerView-won';t在重新启动/崩溃后更新

Java RecyclerView-won';t在重新启动/崩溃后更新,java,android,sockets,Java,Android,Sockets,因此,我正在开发一个涉及套接字的应用程序。通过套接字发送多个字符串,接收端接收该字符串,并相应地更新RecyclerView。它工作正常,直到应用程序崩溃/重新启动。我不知道会发生什么,但Play Store上有一个名为XRecorder的应用程序,每次我使用屏幕截图功能时,我的应用程序都会重新启动。现在,当我通过套接字发送消息时,它会收到消息,但不会更新RecyclerView?Toast出现,这就是我知道它已收到的原因。当我调用removietem() 这是我的密码: @Override p

因此,我正在开发一个涉及套接字的应用程序。通过套接字发送多个字符串,接收端接收该字符串,并相应地更新
RecyclerView
。它工作正常,直到应用程序崩溃/重新启动。我不知道会发生什么,但Play Store上有一个名为XRecorder的应用程序,每次我使用屏幕截图功能时,我的应用程序都会重新启动。现在,当我通过套接字发送消息时,它会收到消息,但不会更新RecyclerView?
Toast
出现,这就是我知道它已收到的原因。当我调用
removietem()

这是我的密码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);
    serverAsync.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}

private class ServerAsync extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... voids) {
            try {
                serverSocket = new ServerSocket(serverPort);
                while (true) {
                    Socket client = serverSocket.accept();
                    isConnected = client.isConnected();

                    if (isConnected) {
                       try {
                           handler.post(new Runnable() {
                               @Override
                               public void run() {
                                   updateStatusUI();
                               }
                           });

                           Entry entry = new Entry();
                           String inputLine;
                           BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
                           while ((inputLine = in.readLine()) != null) {
                               StringBuilder sb = new StringBuilder();
                               String message = inputLine;
                               sb.append(message);
                               entry.add(sb.toString());
                           }

                           //READ NEW ENTRIES
                           handler.post(new Runnable() {
                               @Override
                               public void run() {
                                   splitOrder(entry);
                                   saveArrayList();
                               }
                           });

                           in.close();
                           handler.post(new Runnable() {
                               @Override
                               public void run() {
                                   entryAdapter.notifyDataSetChanged();
                                   Toast.makeText(getApplicationContext(), "In has closed :" + client.getRemoteSocketAddress(), Toast.LENGTH_SHORT).show();
                                   updateStatusUI();
                               }
                           });

                       } catch (Exception e) {
                            Log.e("TEST", e.getMessage(), e);
                       }
                    } else {
                        Toast.makeText(getApplicationContext(), "Client :" + client.getRemoteSocketAddress()+" has DISCONNECTED", Toast.LENGTH_SHORT).show();
                        handler.post(new Runnable() {
                            @Override
                            public void run() {
                                updateStatusUI();
                            }
                        });
                    }
                }

            } catch (Exception e) {
                Log.e("UHE", e.getMessage(), e);

            }
            return null;
        }
    }

public void removeItem(int position) {
     entryAdapter.notifyDataSetChanged();
}
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
把(这个)绑起来;
serverAsync.executeOnExecutor(AsyncTask.THREAD\u POOL\u EXECUTOR);
}
私有类ServerAsync扩展了AsyncTask{
@凌驾
受保护的空位背景(空位…空位){
试一试{
serverSocket=新的serverSocket(serverPort);
while(true){
Socket client=serverSocket.accept();
isConnected=client.isConnected();
如果(未连接){
试一试{
handler.post(新的Runnable(){
@凌驾
公开募捐{
updateStatusUI();
}
});
条目=新条目();
字符串输入线;
BufferedReader in=新的BufferedReader(新的InputStreamReader(client.getInputStream());
而((inputLine=in.readLine())!=null){
StringBuilder sb=新的StringBuilder();
字符串消息=输入行;
某人附加(信息);
添加(sb.toString());
}
//阅读新条目
handler.post(新的Runnable(){
@凌驾
公开募捐{
拆分订单(条目);
saveArrayList();
}
});
in.close();
handler.post(新的Runnable(){
@凌驾
公开募捐{
entryAdapter.notifyDataSetChanged();
Toast.makeText(getApplicationContext(),“In”已关闭:“+client.getRemoteSocketAddress(),Toast.LENGTH_SHORT).show();
updateStatusUI();
}
});
}捕获(例外e){
Log.e(“TEST”,e.getMessage(),e);
}
}否则{
Toast.makeText(getApplicationContext(),“客户端:+Client.getRemoteSocketAddress()+”已断开连接),Toast.LENGTH\u SHORT.show();
handler.post(新的Runnable(){
@凌驾
公开募捐{
updateStatusUI();
}
});
}
}
}捕获(例外e){
Log.e(“UHE”,e.getMessage(),e);
}
返回null;
}
}
公共无效删除项(内部位置){
entryAdapter.notifyDataSetChanged();
}
我已尝试重置
回收视图
的适配器,但它就是不起作用。我还注意到,每次应用程序崩溃并重新启动时,我都会收到
java.net.BindException:bind failed:EADDRINUSE(地址已在使用中)

指向创建我的serverSocket
(serverSocket=newServerSocket(serverPort)


这可能是RecyclerView不会更新的原因吗?ArrayList会随着传入的消息而更新,但不会更新视图。

听起来像是您多次创建了此线程,第二次套接字仍在运行,因此您无法将端口绑定到它,因此会崩溃,因为它从未停止或其他任何操作。我只在启动。我不认为这就是RecyclerView不更新的原因?ArrayList更新得很好,但RecyclerView不会。BindException在崩溃后和应用程序重新启动时出现。