2014-09-19 57 views
10

我有一个相当混乱的问题。我试图通过Android运行一个基本的聊天客户端。我已经在我的主要项目的3个班级中设置了它。问题是,由于某种奇怪的原因,我的ChatConnect.java(处理实际的聊天消息)似乎不会像AndroidManifest.xml一样被弹出,这导致了一些严重的问题 - 我需要使用Layout(特别是game.xml)在我的ChatConnect类中,它拒绝加载,因为没有被定义为清单中的活动。无论如何,这是我的三堂课。Android Manifest - “没有默认构造函数”与活动/运行类

是的,我意识到StrictMode是非常可怕的。但是,即使使用清单中的所述权限,我也无法让聊天客户端在没有它的情况下工作。我试过清理我的项目。

所有帮助非常感谢!

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(); 
     } 
    } 
} 
+0

我不确定这里的问题到底是什么......它“似乎不会像AndroidManifest.xml的Activity一样弹出”? – drewhannay 2014-09-19 00:22:59

+1

鉴于他们的名字,你的活动实际上很少应该是活动。活动用于用户界面。它们不是用于套接字或数据库的通用Java类,也不是用于'SettingsHandler'的任何类。 – CommonsWare 2014-09-19 00:34:37

回答

19

的Android Activity类必须有一个默认的构造函数没有参数。您ChatConnect类有这样的构造:

public ChatConnect(Socket s){ 
     socket = s; 
} 

但系统正在寻找一个这样的:

public ChatConnect(){ 
} 

,并没有找到一个,这就是为什么它的崩溃。