Reputation: 355
I try to connect android to printer via wifi, I got error NetworkOnMainThreadException
.
Here is my code :
public void OnClickPrint(View paramView) {
File file = new File(DB_PATH);
try {
Socket client = new Socket("172.230.1.16", 9100);
byte[] mybytearray = new byte[(int) file.length()];
fileInputStream = new FileInputStream(file);
bufferedInputStream = new BufferedInputStream(fileInputStream);
bufferedInputStream.read(mybytearray, 0, mybytearray.length);
outputStream = client.getOutputStream();
outputStream.write(mybytearray, 0, mybytearray.length); //
outputStream.flush();
bufferedInputStream.close();
outputStream.close();
client.close();
} catch (UnknownHostException e) {
Log.v("a", e.getMessage());
e.printStackTrace();
} catch (IOException e) {
Log.v("a", e.getMessage());
e.printStackTrace();
}
}
When I trace code by F6 , I got errors socket instantiate at Socket client = new Socket("172.230.1.16", 9100);
172.230.1.16 is my printer ip.
Error logcat:
02-28 09:44:40.572: E/AndroidRuntime(1426): FATAL EXCEPTION: main
02-28 09:44:40.572: E/AndroidRuntime(1426): java.lang.IllegalStateException: Could not execute method of the activity
02-28 09:44:40.572: E/AndroidRuntime(1426): at android.view.View$1.onClick(View.java:3044)
02-28 09:44:40.572: E/AndroidRuntime(1426): at android.view.View.performClick(View.java:3511)
02-28 09:44:40.572: E/AndroidRuntime(1426): at android.view.View$PerformClick.run(View.java:14105)
02-28 09:44:40.572: E/AndroidRuntime(1426): at android.os.Handler.handleCallback(Handler.java:605)
02-28 09:44:40.572: E/AndroidRuntime(1426): at android.os.Handler.dispatchMessage(Handler.java:92)
02-28 09:44:40.572: E/AndroidRuntime(1426): at android.os.Looper.loop(Looper.java:137)
02-28 09:44:40.572: E/AndroidRuntime(1426): at android.app.ActivityThread.main(ActivityThread.java:4424)
02-28 09:44:40.572: E/AndroidRuntime(1426): at java.lang.reflect.Method.invokeNative(Native Method)
02-28 09:44:40.572: E/AndroidRuntime(1426): at java.lang.reflect.Method.invoke(Method.java:511)
02-28 09:44:40.572: E/AndroidRuntime(1426): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
02-28 09:44:40.572: E/AndroidRuntime(1426): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
02-28 09:44:40.572: E/AndroidRuntime(1426): at dalvik.system.NativeStart.main(Native Method)
02-28 09:44:40.572: E/AndroidRuntime(1426): Caused by: java.lang.reflect.InvocationTargetException
02-28 09:44:40.572: E/AndroidRuntime(1426): at java.lang.reflect.Method.invokeNative(Native Method)
02-28 09:44:40.572: E/AndroidRuntime(1426): at java.lang.reflect.Method.invoke(Method.java:511)
02-28 09:44:40.572: E/AndroidRuntime(1426): at android.view.View$1.onClick(View.java:3039)
02-28 09:44:40.572: E/AndroidRuntime(1426): ... 11 more
02-28 09:44:40.572: E/AndroidRuntime(1426): Caused by: android.os.NetworkOnMainThreadException
02-28 09:44:40.572: E/AndroidRuntime(1426): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
02-28 09:44:40.572: E/AndroidRuntime(1426): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
02-28 09:44:40.572: E/AndroidRuntime(1426): at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
02-28 09:44:40.572: E/AndroidRuntime(1426): at libcore.io.IoBridge.connect(IoBridge.java:112)
02-28 09:44:40.572: E/AndroidRuntime(1426): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
02-28 09:44:40.572: E/AndroidRuntime(1426): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
02-28 09:44:40.572: E/AndroidRuntime(1426): at java.net.Socket.startupSocket(Socket.java:566)
02-28 09:44:40.572: E/AndroidRuntime(1426): at java.net.Socket.tryAllAddresses(Socket.java:127)
02-28 09:44:40.572: E/AndroidRuntime(1426): at java.net.Socket.<init>(Socket.java:177)
02-28 09:44:40.572: E/AndroidRuntime(1426): at java.net.Socket.<init>(Socket.java:149)
02-28 09:44:40.572: E/AndroidRuntime(1426): at com.example.printertest.MainActivity.OnClickPrint(MainActivity.java:56)
How to solve it ?
Upvotes: 1
Views: 143
Reputation: 29632
Caused by: android.os.NetworkOnMainThreadException
You are performing Network operations on Main Thread of Android OS. I suggest you to use AsyncTask. You should perform a long running Network Operations in AsyncTask. AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers.
public void OnClickPrint(View paramView)
{
new PrintFile().execute();
}
private class PrintFile extends AsyncTask<Void, Void, Void>
{
@Override
protected Void doInBackground(Void... result)
{
File file = new File(DB_PATH);
try {
Socket client = new Socket("172.230.1.16", 9100);
byte[] mybytearray = new byte[(int) file.length()];
fileInputStream = new FileInputStream(file);
bufferedInputStream = new BufferedInputStream(fileInputStream);
bufferedInputStream.read(mybytearray, 0, mybytearray.length);
outputStream = client.getOutputStream();
outputStream.write(mybytearray, 0, mybytearray.length); //
outputStream.flush();
bufferedInputStream.close();
outputStream.close();
client.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
Upvotes: 2