Android致命错误:创建套接字时单击按钮时出现错误java.lang.IllegalStateException
我正试图连接到一个服务器,我正在通过手机运行我的计算机。每次单击connect按钮,它都会显示java.lang.IllegalStateException。单击“连接”按钮时,它会创建一个套接字,用于连接到我计算机上的服务器。 这是错误Android致命错误:创建套接字时单击按钮时出现错误java.lang.IllegalStateException,java,android,sockets,illegalstateexception,Java,Android,Sockets,Illegalstateexception,我正试图连接到一个服务器,我正在通过手机运行我的计算机。每次单击connect按钮,它都会显示java.lang.IllegalStateException。单击“连接”按钮时,它会创建一个套接字,用于连接到我计算机上的服务器。 这是错误 08-21 23:45:26.427: E/AndroidRuntime(4986): FATAL EXCEPTION: main 08-21 23:45:26.427: E/AndroidRuntime(4986): java.lang.IllegalSta
08-21 23:45:26.427: E/AndroidRuntime(4986): FATAL EXCEPTION: main
08-21 23:45:26.427: E/AndroidRuntime(4986): java.lang.IllegalStateException: Could not execute method of the activity
08-21 23:45:26.427: E/AndroidRuntime(4986): at android.view.View$1.onClick(View.java:3044)
08-21 23:45:26.427: E/AndroidRuntime(4986): at android.view.View.performClick(View.java:3511)
08-21 23:45:26.427: E/AndroidRuntime(4986): at android.view.View$PerformClick.run(View.java:14105)
08-21 23:45:26.427: E/AndroidRuntime(4986): at android.os.Handler.handleCallback(Handler.java:605)
08-21 23:45:26.427: E/AndroidRuntime(4986): at android.os.Handler.dispatchMessage(Handler.java:92)
08-21 23:45:26.427: E/AndroidRuntime(4986): at android.os.Looper.loop(Looper.java:137)
08-21 23:45:26.427: E/AndroidRuntime(4986): at android.app.ActivityThread.main(ActivityThread.java:4424)
08-21 23:45:26.427: E/AndroidRuntime(4986): at java.lang.reflect.Method.invokeNative(Native Method)
08-21 23:45:26.427: E/AndroidRuntime(4986): at java.lang.reflect.Method.invoke(Method.java:511)
08-21 23:45:26.427: E/AndroidRuntime(4986): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
08-21 23:45:26.427: E/AndroidRuntime(4986): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
08-21 23:45:26.427: E/AndroidRuntime(4986): at dalvik.system.NativeStart.main(Native Method)
08-21 23:45:26.427: E/AndroidRuntime(4986): Caused by: java.lang.reflect.InvocationTargetException
08-21 23:45:26.427: E/AndroidRuntime(4986): at java.lang.reflect.Method.invokeNative(Native Method)
08-21 23:45:26.427: E/AndroidRuntime(4986): at java.lang.reflect.Method.invoke(Method.java:511)
08-21 23:45:26.427: E/AndroidRuntime(4986): at android.view.View$1.onClick(View.java:3039)
08-21 23:45:26.427: E/AndroidRuntime(4986): ... 11 more
08-21 23:45:26.427: E/AndroidRuntime(4986): Caused by: android.os.NetworkOnMainThreadException
08-21 23:45:26.427: E/AndroidRuntime(4986): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
08-21 23:45:26.427: E/AndroidRuntime(4986): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
08-21 23:45:26.427: E/AndroidRuntime(4986): at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
08-21 23:45:26.427: E/AndroidRuntime(4986): at libcore.io.IoBridge.connect(IoBridge.java:112)
08-21 23:45:26.427: E/AndroidRuntime(4986): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
08-21 23:45:26.427: E/AndroidRuntime(4986): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
08-21 23:45:26.427: E/AndroidRuntime(4986): at java.net.Socket.startupSocket(Socket.java:566)
08-21 23:45:26.427: E/AndroidRuntime(4986): at java.net.Socket.<init>(Socket.java:225)
08-21 23:45:26.427: E/AndroidRuntime(4986): at com.example.socketconnection.Singleton.connect(Singleton.java:44)
08-21 23:45:26.427: E/AndroidRuntime(4986): at com.example.socketconnection.MainActivity.connect(MainActivity.java:47)
08-21 23:45:26.427: E/AndroidRuntime(4986): ... 14 more
Singleton.java的代码
package com.example.socketconnection;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
public class Singleton
{
private Socket socket;
private DataInputStream input;
private DataOutputStream output;
private boolean logged;
private static Singleton instance;
private String information;
private String userName;
private String password;
private Singleton()
{
}
public static Singleton getInstance()
{
return instance;
}
public static void initSingleton()
{
if(instance == null)
{
instance = new Singleton();
}
}
public String connect(String userName, String password)
{
this.userName = userName;
this.password = password;
try
{
this.socket = new Socket(InetAddress.getByName("192.168.1.79"), 9000);
this.input = new DataInputStream(socket.getInputStream());
this.output = new DataOutputStream(socket.getOutputStream());
output.writeUTF("login");
output.flush();
output.writeUTF(userName);
output.flush();
output.writeUTF(password);
output.flush();
this.information = input.readUTF();
}
catch(IOException ex)
{
this.information = "Cannot connect to Server";
}
return information;
}
public void setLogged(boolean logged)
{
this.logged = logged;
}
public Socket getSocket()
{
return socket;
}
public DataInputStream getInput()
{
return input;
}
public DataOutputStream getOutput()
{
return output;
}
public boolean getLogged()
{
return logged;
}
}
UserList.java的代码
package com.example.socketconnection;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class UserList extends Activity
{
private Socket socket;
private DataInputStream input;
private DataOutputStream output;
private String userName;
private String [] users;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user_list);
Intent intent = getIntent();
userName = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
ListView userList = (ListView)findViewById(R.id.userList);
users = new String[0];
ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, users);
userList.setAdapter(listAdapter);
socket = Singleton.getInstance().getSocket();
input = Singleton.getInstance().getInput();
output = Singleton.getInstance().getOutput();
Runnable task = new UpdateTask(listAdapter);
Thread thread = new Thread(task);
thread.start();
}
class UpdateTask implements Runnable
{
private ArrayAdapter<String> adapter;
private boolean logged = true;
public UpdateTask(ArrayAdapter<String> adapter)
{
this.adapter = adapter;
}
public void loggedOut(boolean logged)
{
this.logged = logged;
}
public void run()
{
try
{
while(logged)
{
if(input.available() > 0)
{
String message = input.readUTF();
if(!message.equalsIgnoreCase("chat"))
{
users = getList(message);
adapter.notifyDataSetChanged();
}
}
Thread.sleep(100);
}
}
catch(IOException ex)
{
}
catch(InterruptedException ex)
{
}
}
public String[] getList(String message)
{
String line = message;
String[] list;
String[] split;
int counter = 0;
String temp = line.substring(1, line.length() - 1);
split = temp.split(", ");
if(split.length == 1)
{
list = new String[0];
}
else
{
list = new String[split.length - 1];
for(int i = 0; i < split.length; i++)
{
if(!split[i].equalsIgnoreCase(userName))
{
list[counter] = split[i];
counter++;
}
}
}
return list;
}
}
package com.example.socketconnection;
导入java.io.DataInputStream;
导入java.io.DataOutputStream;
导入java.io.IOException;
导入java.net.Socket;
导入java.util.List;
导入android.app.Activity;
导入android.content.Intent;
导入android.os.Bundle;
导入android.view.Menu;
导入android.widget.ArrayAdapter;
导入android.widget.ListView;
公共类UserList扩展活动
{
专用插座;
私有数据输入流输入;
私有数据输出流输出;
私有字符串用户名;
私有字符串[]用户;
@凌驾
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u user\u list);
Intent=getIntent();
userName=intent.getStringExtra(MainActivity.EXTRA_消息);
ListView用户列表=(ListView)findViewById(R.id.userList);
用户=新字符串[0];
ArrayAdapter listAdapter=新的ArrayAdapter(这是android.R.layout.simple_list_item_1,android.R.id.text1,用户);
setAdapter(listAdapter);
socket=Singleton.getInstance().getSocket();
input=Singleton.getInstance().getInput();
output=Singleton.getInstance().getOutput();
Runnable task=newupdatetask(listAdapter);
线程线程=新线程(任务);
thread.start();
}
类UpdateTask实现可运行
{
专用阵列适配器;
私有布尔值=真;
公共更新任务(ArrayAdapter适配器)
{
this.adapter=适配器;
}
公共无效日志(布尔值日志)
{
this.logged=logged;
}
公开募捐
{
尝试
{
同时(记录)
{
if(input.available()>0)
{
字符串消息=input.readUTF();
如果(!message.equalsIgnoreCase(“聊天”))
{
用户=获取列表(消息);
adapter.notifyDataSetChanged();
}
}
睡眠(100);
}
}
捕获(IOEX异常)
{
}
捕获(中断异常例外)
{
}
}
公共字符串[]获取列表(字符串消息)
{
字符串行=消息;
字符串[]列表;
字符串[]拆分;
int计数器=0;
字符串温度=行子字符串(1,行长度()-1);
拆分=临时拆分(“,”);
如果(split.length==1)
{
列表=新字符串[0];
}
其他的
{
列表=新字符串[split.length-1];
对于(int i=0;i
}您不能用
单例.connect
调用像那样阻塞主applocation线程
相反,利用您可以在
doInBackground
:-)的上下文中安全地调用connect
),然后可以在onPostExecute
的主应用程序线程上下文中安全地执行依赖于您的结果的代码。您正在主线程中执行网络操作。创建AsyncTask并在后台方法中执行。
package com.example.socketconnection;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class UserList extends Activity
{
private Socket socket;
private DataInputStream input;
private DataOutputStream output;
private String userName;
private String [] users;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user_list);
Intent intent = getIntent();
userName = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
ListView userList = (ListView)findViewById(R.id.userList);
users = new String[0];
ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, users);
userList.setAdapter(listAdapter);
socket = Singleton.getInstance().getSocket();
input = Singleton.getInstance().getInput();
output = Singleton.getInstance().getOutput();
Runnable task = new UpdateTask(listAdapter);
Thread thread = new Thread(task);
thread.start();
}
class UpdateTask implements Runnable
{
private ArrayAdapter<String> adapter;
private boolean logged = true;
public UpdateTask(ArrayAdapter<String> adapter)
{
this.adapter = adapter;
}
public void loggedOut(boolean logged)
{
this.logged = logged;
}
public void run()
{
try
{
while(logged)
{
if(input.available() > 0)
{
String message = input.readUTF();
if(!message.equalsIgnoreCase("chat"))
{
users = getList(message);
adapter.notifyDataSetChanged();
}
}
Thread.sleep(100);
}
}
catch(IOException ex)
{
}
catch(InterruptedException ex)
{
}
}
public String[] getList(String message)
{
String line = message;
String[] list;
String[] split;
int counter = 0;
String temp = line.substring(1, line.length() - 1);
split = temp.split(", ");
if(split.length == 1)
{
list = new String[0];
}
else
{
list = new String[split.length - 1];
for(int i = 0; i < split.length; i++)
{
if(!split[i].equalsIgnoreCase(userName))
{
list[counter] = split[i];
counter++;
}
}
}
return list;
}
}