Android 尝试使用AsyncTask和Thread解决NetworkMainThreadException,两者都保持相同的异常
我试图在手机上创建一个套接字服务器,我检查了我的案例中使用的套接字服务器,它一直给我NetworkOnMainThreadException。任何人都能看出我的问题在哪里?我尝试添加internet权限,也使用了线程和异步任务,我不知道为什么我做不到 服务器端代码(异步任务版本): 服务器端代码(线程版本) 错误(异步任务版本):Android 尝试使用AsyncTask和Thread解决NetworkMainThreadException,两者都保持相同的异常,android,multithreading,android-asynctask,network-programming,Android,Multithreading,Android Asynctask,Network Programming,我试图在手机上创建一个套接字服务器,我检查了我的案例中使用的套接字服务器,它一直给我NetworkOnMainThreadException。任何人都能看出我的问题在哪里?我尝试添加internet权限,也使用了线程和异步任务,我不知道为什么我做不到 服务器端代码(异步任务版本): 服务器端代码(线程版本) 错误(异步任务版本): 08-22 16:35:05.829:I/serverFragment(22134):onCreate启动 08-22 16:35:05.839:I/serverFr
08-22 16:35:05.829:I/serverFragment(22134):onCreate启动
08-22 16:35:05.839:I/serverFragment(22134):onCreateView启动
08-22 16:35:05.839:I/serverFragment(22134):runServer()启动
08-22 16:35:05.839:I/serverFragment(22134):waitForConnection()启动
08-22 16:35:05.889:I/Adreno EGL(22134)::EGL 1.4高通公司版本:I0404C4692AFB8623F95C43AEB6D5E13ED4B30DDB日期:2013年6月11日
08-22 16:35:05.940:D/OpenGLRenderer(22134):启用调试模式0
08-22 16:35:13.027:D/AndroidRuntime(22134):关闭虚拟机
08-22 16:35:13.027:W/dalvikvm(22134):threadid=1:线程以未捕获异常退出(组=0x415dcba8)
08-22 16:35:13.027:I/serverFragment(22134):getStreams()的输出开始
08-22 16:35:13.027:E/AndroidRuntime(22134):致命异常:主
08-22 16:35:13.027:E/AndroidRuntime(22134):进程:com.example.socketserver,PID:22134
08-22 16:35:13.027:E/AndroidRuntime(22134):android.os.NetworkOnMainThreadException
08-22 16:35:13.027:E/AndroidRuntime(22134):在android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)
08-22 16:35:13.027:E/AndroidRuntime(22134):位于java.net.InetAddress.getHostByAddrImpl(InetAddress.java:438)
08-22 16:35:13.027:E/AndroidRuntime(22134):位于java.net.InetAddress.getHostName(InetAddress.java:307)
08-22 16:35:13.027:E/AndroidRuntime(22134):在com.example.socketserver.ServerFragment$connection$3.run(ServerFragment.java:216)
08-22 16:35:13.027:E/AndroidRuntime(22134):在android.os.Handler.handleCallback(Handler.java:733)上
08-22 16:35:13.027:E/AndroidRuntime(22134):在android.os.Handler.dispatchMessage(Handler.java:95)上
08-22 16:35:13.027:E/AndroidRuntime(22134):在android.os.Looper.loop(Looper.java:136)
08-22 16:35:13.027:E/AndroidRuntime(22134):在android.app.ActivityThread.main(ActivityThread.java:5001)上
08-22 16:35:13.027:E/AndroidRuntime(22134):位于java.lang.reflect.Method.Invokenactive(本机方法)
08-22 16:35:13.027:E/AndroidRuntime(22134):位于java.lang.reflect.Method.invoke(Method.java:515)
08-22 16:35:13.027:E/AndroidRuntime(22134):在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
08-22 16:35:13.027:E/AndroidRuntime(22134):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
08-22 16:35:13.027:E/AndroidRuntime(22134):在dalvik.system.NativeStart.main(本机方法)
0
8-22 16:40:13.167:I/进程(22134):发送信号。PID:22134信号:9
错误(线程版本):
错误:
08-22 16:28:30.488:I/serverFragment(20568):onCreate启动
08-22 16:28:30.498:I/serverFragment(20568):onCreateView启动
08-22 16:28:30.498:I/serverFragment(20568):waitForConnection()启动
08-22 16:28:30.548:I/Adreno EGL(20568)::EGL 1.4高通公司版本:I0404C4692AFB8623F95C43AEB6D5E13ED4B30DDB日期:2013年6月11日
08-22 16:28:30.588:D/OpenGLRenderer(20568):启用调试模式0
08-22 16:28:38.836:D/AndroidRuntime(20568):关闭虚拟机
08-22 16:28:38.836:W/dalvikvm(20568):threadid=1:线程以未捕获异常退出(组=0x415dcba8)
08-22 16:28:38.836:I/serverFragment(20568):getStreams()的输出开始
08-22 16:28:38.836:E/AndroidRuntime(20568):致命异常:主
08-22 16:28:38.836:E/AndroidRuntime(20568):进程:com.example.socketserver,PID:20568
08-22 16:28:38.836:E/AndroidRuntime(20568):android.os.NetworkOnMainThreadException
08-22 16:28:38.836:E/AndroidRuntime(20568):在android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)
08-22 16:28:38.836:E/AndroidRuntime(20568):位于java.net.InetAddress.getHostByAddrImpl(InetAddress.java:438)
08-22 16:28:38.836:E/AndroidRuntime(20568):位于java.net.InetAddress.getHostName(InetAddress.java:307)
08-22 16:28:38.836:E/AndroidRuntime(20568):在com.example.socketserver.ServerFragment$4.run(ServerFragment.java:248)
08-22 16:28:38.836:E/AndroidRuntime(20568):在android.os.Handler.handleCallback(Handler.java:733)上
08-22 16:28:38.836:E/AndroidRuntime(20568):在android.os.Handler.dispatchMessage(Handler.java:95)上
08-22 16:28:38.836:E/AndroidRuntime(20568):在android.os.Looper.loop(Looper.java:136)
08-22 16:28:38.836:E/AndroidRuntime(20568):在android.app.ActivityThread.main(ActivityThread.java:5001)上
08-22 16:28:38.836:E/AndroidRuntime(20568):位于java.lang.reflect.Method.Invokenactive(本机方法)
08-22 16:28:38.836:E/AndroidRuntime(20568):位于java.lang.reflect.Method.invoke(Method.java:515)
08-22 16:28:38.836:E/AndroidRuntime(20568):在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
08-22 16:28:38.836:E/AndroidRuntime(20568):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
08-22 16:28:38.836:E/AndroidRuntime(20568):在dalvik.system.NativeStart.main(本机方法)
08-22 16:32:37.431:I/进程(20568):发送信号。PID:20568 SIG
您正在主应用程序线程上调用getHostName()
,从传递到runOnUiThread()
的Runnable
。您需要从后台线程检索主机名。您正在主应用程序线程上调用getHostName()
,从传递给runOnUiThread()
的Runnable
中调用。您需要从后台线程中检索主机名。是的,您说得对。谢谢,你说得对。谢谢
package com.example.socketserver;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OptionalDataException;
import java.io.StreamCorruptedException;
import java.net.ServerSocket;
import java.net.Socket;
import android.R.string;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class ServerFragment extends Fragment {
ServerSocket serverSocket;
Socket connectionSocket;
private Button mSentButton;
private TextView mMessageTextView;
private EditText mMessagEditText;
private int counter =1;
private ObjectOutputStream outputStream;
private ObjectInputStream inputStream;
private static String TAG="serverFragment";
private String message;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Log.i(TAG,"onCreate starts");
}
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState)
{
//refer a view which wires a layout
View v = inflater.inflate(R.layout.fragment_server,parent,false);
mSentButton=(Button)v.findViewById(R.id.Sentbutton);
mMessageTextView=(TextView)v.findViewById(R.id.messageTextView);
Log.i(TAG,"onCreateView starts");
mMessageTextView.setText("Waiting for connection\n");
mMessagEditText=(EditText)v.findViewById(R.id.Message);
new connection().execute();
return v;
}
private class connection extends AsyncTask{
@Override
protected Object doInBackground(Object... params) {
// TODO Auto-generated method stub
try {
runServer();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public void runServer() throws IOException
{
try {
serverSocket= new ServerSocket(8080,100);
} catch (Exception e) {
mMessageTextView.append("\nRun Server terminated connection");
}
Log.i(TAG,"runServer() starts");
while(true)
{
try {
waitForConnection();
} catch (Exception e) {
mMessageTextView.append("\nWait terminated connection");
Log.i(TAG,"\nWait terminated connection "+e.toString());
}
try {
getStream();
} catch (Exception e) {
mMessageTextView.append("\n GetStream() terminated connection");
Log.i(TAG,"\n GetStream() terminated connection"+ e.toString());
}
try{
processConnection();
} catch (Exception e) {
mMessageTextView.append("\n processConnection() terminated connection");
Log.i(TAG,"\n processConnection() terminated connection"+ e.toString());
}
finally
{
closeConnection();
counter++;
}
}
}
private void sentDate(String message)
{
try {
outputStream.writeObject("SERVER>>>"+message);
outputStream.flush();
mMessageTextView.append("\nSERVER>>>"+ message);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void closeConnection() throws IOException {
// TODO Auto-generated method stub
Log.i(TAG,"closeConnection starts");
mMessageTextView.append("\nTerminating connection\n");
outputStream.close();
inputStream.close();
connectionSocket.close();
}
private void processConnection() {
// TODO Auto-generated method stub
message="Connection successful!";
sentDate(message);
Log.i(TAG,"ProcessConnection starts");
do {
try {
message=(String)inputStream.readObject();
} catch (OptionalDataException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
mMessageTextView.append("\n Unknown object type received");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
mMessageTextView.append("\n"+ message);
}
});
} while (!message.equals("CLIENT>>> TERMINATE"));
}
private void getStream() throws IOException {
outputStream = new ObjectOutputStream(connectionSocket.getOutputStream());
outputStream.flush();
Log.i(TAG,"getStreams()'s output starts");
inputStream = new ObjectInputStream(connectionSocket.getInputStream());
Log.i(TAG,"getStreams()'s input created");
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
mMessageTextView.append("\nGot i/O stream \n");
}
});
}
private void waitForConnection() throws IOException {
// TODO Auto-generated method stub
Log.i(TAG,"waitForConnection() starts");
mMessageTextView.setText("Waiting for connection\n");
try {
connectionSocket=serverSocket.accept();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
mMessagEditText.append("Connection "+ counter+ " received from : "
+ connectionSocket.getInetAddress().getHostName());
}
});
}
}
}
package com.example.socketserver;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OptionalDataException;
import java.io.StreamCorruptedException;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerFragment extends Fragment {
ServerSocket serverSocket;
Socket connectionSocket;
private Button mSentButton;
private TextView mMessageTextView;
private EditText mMessagEditText;
private int counter =1;
private ObjectOutputStream outputStream;
private ObjectInputStream inputStream;
private static String TAG="serverFragment";
private String message;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Log.i(TAG,"onCreate starts");
}
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState)
{
//refer a view which wires a layout
View v = inflater.inflate(R.layout.fragment_server,parent,false);
mSentButton=(Button)v.findViewById(R.id.Sentbutton);
mMessageTextView=(TextView)v.findViewById(R.id.messageTextView);
Log.i(TAG,"onCreateView starts");
mMessageTextView.setText("Waiting for connection\n");
mMessagEditText=(EditText)v.findViewById(R.id.Message);
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
serverSocket= new ServerSocket(8080,100);
} catch (Exception e) {
mMessageTextView.append("\nRun Server terminated connection");
}
try {
waitForConnection();
getStream();
processConnection();
closeConnection();
counter++;
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
thread.start();
//new connection().execute();
return v;
}
/*
private class connection extends AsyncTask{
@Override
protected Object doInBackground(Object... params) {
// TODO Auto-generated method stub
try {
serverSocket= new ServerSocket(8080,100);
} catch (Exception e) {
mMessageTextView.append("\nRun Server terminated connection");
}
try {
waitForConnection();
getStream();
processConnection();
closeConnection();
counter++;
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
*/
/*
public void runServer() throws IOException
{
try {
serverSocket= new ServerSocket(8080,100);
} catch (Exception e) {
mMessageTextView.append("\nRun Server terminated connection");
}
Log.i(TAG,"runServer() starts");
while(true)
{
try {
waitForConnection();
} catch (Exception e) {
mMessageTextView.append("\nWait terminated connection");
Log.i(TAG,"\nWait terminated connection "+e.toString());
}
try {
getStream();
} catch (Exception e) {
mMessageTextView.append("\n GetStream() terminated connection");
Log.i(TAG,"\n GetStream() terminated connection"+ e.toString());
}
try{
processConnection();
} catch (Exception e) {
mMessageTextView.append("\n processConnection() terminated connection");
Log.i(TAG,"\n processConnection() terminated connection"+ e.toString());
}
finally
{
closeConnection();
counter++;
}
}
}
*/
private void sentDate(String message)
{
try {
outputStream.writeObject("SERVER>>>"+message);
outputStream.flush();
mMessageTextView.append("\nSERVER>>>"+ message);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void closeConnection() throws IOException {
// TODO Auto-generated method stub
Log.i(TAG,"closeConnection starts");
mMessageTextView.append("\nTerminating connection\n");
outputStream.close();
inputStream.close();
connectionSocket.close();
}
private void processConnection() {
// TODO Auto-generated method stub
message="Connection successful!";
sentDate(message);
Log.i(TAG,"ProcessConnection starts");
do {
try {
message=(String)inputStream.readObject();
} catch (OptionalDataException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
mMessageTextView.append("\n Unknown object type received");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
mMessageTextView.append("\n"+ message);
}
});
} while (!message.equals("CLIENT>>> TERMINATE"));
}
private void getStream() throws IOException {
outputStream = new ObjectOutputStream(connectionSocket.getOutputStream());
outputStream.flush();
Log.i(TAG,"getStreams()'s output starts");
inputStream = new ObjectInputStream(connectionSocket.getInputStream());
Log.i(TAG,"getStreams()'s input created");
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
mMessageTextView.append("\nGot i/O stream \n");
}
});
}
private void waitForConnection() throws IOException {
// TODO Auto-generated method stub
Log.i(TAG,"waitForConnection() starts");
mMessageTextView.setText("Waiting for connection\n");
try {
connectionSocket=serverSocket.accept();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
mMessagEditText.append("Connection "+ counter+ " received from : "
+ connectionSocket.getInetAddress().getHostName());
}
});
}
}
08-22 16:35:05.829: I/serverFragment(22134): onCreate starts
08-22 16:35:05.839: I/serverFragment(22134): onCreateView starts
08-22 16:35:05.839: I/serverFragment(22134): runServer() starts
08-22 16:35:05.839: I/serverFragment(22134): waitForConnection() starts
08-22 16:35:05.889: I/Adreno-EGL(22134): <qeglDrvAPI_eglInitialize:320>: EGL 1.4 QUALCOMM Build: I0404c4692afb8623f95c43aeb6d5e13ed4b30ddbDate: 11/06/13
08-22 16:35:05.940: D/OpenGLRenderer(22134): Enabling debug mode 0
08-22 16:35:13.027: D/AndroidRuntime(22134): Shutting down VM
08-22 16:35:13.027: W/dalvikvm(22134): threadid=1: thread exiting with uncaught exception (group=0x415dcba8)
08-22 16:35:13.027: I/serverFragment(22134): getStreams()'s output starts
08-22 16:35:13.027: E/AndroidRuntime(22134): FATAL EXCEPTION: main
08-22 16:35:13.027: E/AndroidRuntime(22134): Process: com.example.socketserver, PID: 22134
08-22 16:35:13.027: E/AndroidRuntime(22134): android.os.NetworkOnMainThreadException
08-22 16:35:13.027: E/AndroidRuntime(22134): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)
08-22 16:35:13.027: E/AndroidRuntime(22134): at java.net.InetAddress.getHostByAddrImpl(InetAddress.java:438)
08-22 16:35:13.027: E/AndroidRuntime(22134): at java.net.InetAddress.getHostName(InetAddress.java:307)
08-22 16:35:13.027: E/AndroidRuntime(22134): at com.example.socketserver.ServerFragment$connection$3.run(ServerFragment.java:216)
08-22 16:35:13.027: E/AndroidRuntime(22134): at android.os.Handler.handleCallback(Handler.java:733)
08-22 16:35:13.027: E/AndroidRuntime(22134): at android.os.Handler.dispatchMessage(Handler.java:95)
08-22 16:35:13.027: E/AndroidRuntime(22134): at android.os.Looper.loop(Looper.java:136)
08-22 16:35:13.027: E/AndroidRuntime(22134): at android.app.ActivityThread.main(ActivityThread.java:5001)
08-22 16:35:13.027: E/AndroidRuntime(22134): at java.lang.reflect.Method.invokeNative(Native Method)
08-22 16:35:13.027: E/AndroidRuntime(22134): at java.lang.reflect.Method.invoke(Method.java:515)
08-22 16:35:13.027: E/AndroidRuntime(22134): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
08-22 16:35:13.027: E/AndroidRuntime(22134): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
08-22 16:35:13.027: E/AndroidRuntime(22134): at dalvik.system.NativeStart.main(Native Method)
0
8-22 16:40:13.167: I/Process(22134): Sending signal. PID: 22134 SIG: 9
ERROR:
08-22 16:28:30.488: I/serverFragment(20568): onCreate starts
08-22 16:28:30.498: I/serverFragment(20568): onCreateView starts
08-22 16:28:30.498: I/serverFragment(20568): waitForConnection() starts
08-22 16:28:30.548: I/Adreno-EGL(20568): <qeglDrvAPI_eglInitialize:320>: EGL 1.4 QUALCOMM Build: I0404c4692afb8623f95c43aeb6d5e13ed4b30ddbDate: 11/06/13
08-22 16:28:30.588: D/OpenGLRenderer(20568): Enabling debug mode 0
08-22 16:28:38.836: D/AndroidRuntime(20568): Shutting down VM
08-22 16:28:38.836: W/dalvikvm(20568): threadid=1: thread exiting with uncaught exception (group=0x415dcba8)
08-22 16:28:38.836: I/serverFragment(20568): getStreams()'s output starts
08-22 16:28:38.836: E/AndroidRuntime(20568): FATAL EXCEPTION: main
08-22 16:28:38.836: E/AndroidRuntime(20568): Process: com.example.socketserver, PID: 20568
08-22 16:28:38.836: E/AndroidRuntime(20568): android.os.NetworkOnMainThreadException
08-22 16:28:38.836: E/AndroidRuntime(20568): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)
08-22 16:28:38.836: E/AndroidRuntime(20568): at java.net.InetAddress.getHostByAddrImpl(InetAddress.java:438)
08-22 16:28:38.836: E/AndroidRuntime(20568): at java.net.InetAddress.getHostName(InetAddress.java:307)
08-22 16:28:38.836: E/AndroidRuntime(20568): at com.example.socketserver.ServerFragment$4.run(ServerFragment.java:248)
08-22 16:28:38.836: E/AndroidRuntime(20568): at android.os.Handler.handleCallback(Handler.java:733)
08-22 16:28:38.836: E/AndroidRuntime(20568): at android.os.Handler.dispatchMessage(Handler.java:95)
08-22 16:28:38.836: E/AndroidRuntime(20568): at android.os.Looper.loop(Looper.java:136)
08-22 16:28:38.836: E/AndroidRuntime(20568): at android.app.ActivityThread.main(ActivityThread.java:5001)
08-22 16:28:38.836: E/AndroidRuntime(20568): at java.lang.reflect.Method.invokeNative(Native Method)
08-22 16:28:38.836: E/AndroidRuntime(20568): at java.lang.reflect.Method.invoke(Method.java:515)
08-22 16:28:38.836: E/AndroidRuntime(20568): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
08-22 16:28:38.836: E/AndroidRuntime(20568): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
08-22 16:28:38.836: E/AndroidRuntime(20568): at dalvik.system.NativeStart.main(Native Method)
08-22 16:32:37.431: I/Process(20568): Sending signal. PID: 20568 SIG