我试图在java上创建一个简单的android客户端,使用TCP将字符串发送到PC上的python服务器。但是,我不断收到此错误消息。它让我运行我的应用程序,但每当我尝试发送字符串时它就会崩溃。我正在使用Android Studio 2.1.2,我在物理Android设备上运行测试。这是代码(未完成但应该已经发送了字符串):
package brea.breverser;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class RequestToServer extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_request_to_server);
//Connect();
}
public void sendPlay(View view) {
try {
Socket s = new Socket("192.168.1.35", 5000);
DataOutputStream output = new DataOutputStream(s.getOutputStream());
output.writeUTF("HELLO_WORLD");
output.close();
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
这是AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="brea.breverser">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".RequestToServer">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
引发以下异常:
'brea.breverser.RequestToServer' is not assignable to 'android.app.Activity' (at line 14)
这里有logcat:
08-23 00:17:32.661 29558-29558/brea.breverser W/ActivityThread: Application brea.breverser can be debugged on port 8100...
08-23 00:17:32.681 29558-29558/brea.breverser W/System: ClassLoader referenced unknown path: /data/app/brea.breverser-2/lib/arm
08-23 00:17:33.942 29558-29558/brea.breverser W/System: ClassLoader referenced unknown path: /data/app/brea.breverser-2/lib/arm
08-23 00:17:34.257 29558-29558/brea.breverser W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
08-23 00:17:34.393 29558-29636/brea.breverser D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
08-23 00:17:34.458 29558-29636/brea.breverser I/Adreno-EGL: <qeglDrvAPI_eglInitialize:379>: QUALCOMM Build: 10/09/15, 6cbbf7d, I3193f6e94a
08-23 00:17:34.461 29558-29636/brea.breverser I/OpenGLRenderer: Initialized EGL, version 1.4
08-23 00:17:36.937 29558-29558/brea.breverser D/AndroidRuntime: Shutting down VM
08-23 00:17:36.960 29558-29558/brea.breverser E/AndroidRuntime: FATAL EXCEPTION: main
Process: brea.breverser, PID: 29558
java.lang.IllegalStateException: Could not execute method for android:onClick
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293)
at android.view.View.performClick(View.java:5201)
at android.view.View$PerformClick.run(View.java:21163)
at android.os.Handler.handleCallback(Handler.java:746)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5443)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
at android.view.View.performClick(View.java:5201)
at android.view.View$PerformClick.run(View.java:21163)
at android.os.Handler.handleCallback(Handler.java:746)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5443)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
Caused by: android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1287)
at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110)
at libcore.io.IoBridge.connectErrno(IoBridge.java:137)
at libcore.io.IoBridge.connect(IoBridge.java:122)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:163)
at java.net.Socket.startupSocket(Socket.java:592)
at java.net.Socket.tryAllAddresses(Socket.java:128)
at java.net.Socket.<init>(Socket.java:178)
at java.net.Socket.<init>(Socket.java:150)
at brea.breverser.RequestToServer.sendPlay(RequestToServer.java:26)
at java.lang.reflect.Method.invoke(Native Method)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
at android.view.View.performClick(View.java:5201)
at android.view.View$PerformClick.run(View.java:21163)
at android.os.Handler.handleCallback(Handler.java:746)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5443)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
答案 0 :(得分:1)
我不认为您的清单是问题,应用程序包名称&amp;活动名称与您的活动的包关键字对齐。
从您的转储中,看起来异常的原因是您的“主线程上的网络”异常。尝试将网络活动移动到后台线程,看看会发生什么。在主线程上进行网络调用从来都不是一个好主意,当你尝试这样做时,操作系统会抛出异常。
尝试使用AsyncTask或尝试将实际网络调用包装在runnable中并将其提交给后台工作线程。
答案 1 :(得分:0)
引起:android.os.NetworkOnMainThreadException
Android不允许应用主线程上的网络活动。您需要创建一个新线程来执行此操作。有关详细信息,请参阅How to fix android.os.NetworkOnMainThreadException?。