我有一个相当困惑的问题。我正在尝试通过Android运行基本的聊天客户端。我已经在主项目的3个类中进行了设置。问题是,出于某种奇怪的原因,我的ChatConnect.java(用于处理实际的聊天消息)似乎没有作为AndroidManifest.xml的 Activity 弹出,这引起了一些严重的问题-我也需要使用Layout(特别是我的ChatConnect类中的game.xml),并且由于未在 list 中定义为 Activity 而拒绝加载。无论如何,这是我的三堂课。
是的,我意识到StrictMode非常糟糕。但是,即使 list 中有上述权限,我也无法使聊天客户端无法工作。我试过清理我的项目。
非常感谢所有帮助!
ChatConnect.java
package com.example.AndroidRPGNew.multiplayer;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.example.AndroidRPGNew.Main;
import com.example.AndroidRPGNew.R;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class ChatConnect extends Activity implements Runnable {
// Begin displaying messages to game.xml. Display to chatView via new lines.
// Ability to send message via chatMessageSend - Sends chat message data from chatMessage text field
// Once connected, log to chat. Allow for multicolors, etc.
private Socket socket;
public String userId;
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.game);
SharedPreferences settings = getSharedPreferences(Main.PREFS_NAME, 0);
userId = settings.getString("userId", "unknown");
run();
}
public ChatConnect(Socket s){
socket = s;
}
public void run(){
try{
final Scanner chat = new Scanner(System.in);
final Scanner in = new Scanner(socket.getInputStream());
final PrintWriter out = new PrintWriter(socket.getOutputStream());
Button sendMessage = (Button) findViewById(R.id.chatMessageSend); // ERROR HERE: ALTHOUGH IT IS SUPPOSED TO BE IN GAME.XML CONTENT VIEW, THIS CAUSES A NULLPOINTER!
sendMessage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TextView input = (TextView) findViewById(R.id.chatMessage);
String inputMsg = input.toString();
out.println(inputMsg);
out.flush();
if(in.hasNext()){
System.out.println(in.nextLine());
}
}
});
while(true){
String input = chat.nextLine();
out.println(input);
out.flush();
if(in.hasNext()){
System.out.println(in.nextLine());
}
}
}
catch(Exception e){
e.printStackTrace();
}
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.AndroidRPGNew"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="16"/>
<application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
<activity android:name="com.example.AndroidRPGNew.Main"
android:label="@string/app_name"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name="com.example.AndroidRPGNew.SettingsHandler"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen">
</activity>
<activity android:name="com.example.AndroidRPGNew.StoreHandler"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen">
</activity>
<activity android:name="com.example.AndroidRPGNew.Loading"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen">
</activity>
<activity android:name="com.example.AndroidRPGNew.MusicInitiator"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen">
</activity>
<activity android:name="com.example.AndroidRPGNew.multiplayer.AccountCreate"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen">
</activity>
<activity android:name="com.example.AndroidRPGNew.multiplayer.AccountSetup"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen">
</activity>
<activity android:name="com.example.AndroidRPGNew.multiplayer.MultiplayerMenu"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen">
</activity>
<activity android:name="com.example.AndroidRPGNew.multiplayer.SQLConnection"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen">
</activity>
<activity android:name="com.example.AndroidRPGNew.multiplayer.ServerConnect"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen">
</activity>
<activity android:name="com.example.AndroidRPGNew.multiplayer.ChatConnect"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen">
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.NETWORK" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
</manifest>
ServerConnect.java
package com.example.AndroidRPGNew.multiplayer;
import android.app.Activity;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import com.example.AndroidRPGNew.R;
import java.net.Socket;
/**
* Created by fccardiff on 9/18/14.
*/
public class ServerConnect extends Activity {
// Establish connection to server, with IP from MultiplayerMenu
// Initiate ChatConnect
String userId = null;
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
setContentView(R.layout.game);
// TODO: KEEP THE ABOVE TWO LINES ONLY TEMPORARILY - FIND A FIX!
connect();
}
public void connect() {
final int port = 2525;
final String IP = MultiplayerMenu.getIP();
try {
Socket s = new Socket(IP, port);
Log.w("Server:", "Connected to " + IP + ":" + port);
ChatConnect client = new ChatConnect(s);
Thread thread = new Thread(client);
thread.start();
} catch (Exception serverNotFound) {
serverNotFound.printStackTrace();
}
}
}
最佳答案
Android Activity
类必须具有不带参数的默认构造函数。您的ChatConnect
类具有以下构造函数:
public ChatConnect(Socket s){
socket = s;
}
但是系统正在寻找这样的一个:
public ChatConnect(){
}
却找不到一个,这就是它崩溃的原因。