0

AndroidからJavaアプリケーションへのクライアントサーバー接続があります。私が行っているのは、writeObjectを使用してArrayListを記述しているため、readObjectを実行した後にArrayListにキャストして戻すことができますが、次の例外が発生します。

01-07 11:10:08.821: E/AndroidRuntime(1314): Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to java.util.ArrayList
01-07 11:10:08.821: E/AndroidRuntime(1314):     at com.williamhenry.audiobolle.ConnectionToServer.getUsers(ConnectionToServer.java:127)

Androidアプリケーションは、コマンドGETUSERSを使用してユーザーを取得するようにサーバーに指示します

これはMainActivity.javaにあります

adapter=new ListAdapter(this, new ConnectionToServer().execute("GETUSERS").get());

これは、例外がスローされるConnectionToServer.java部分(変換される行)にあります。

private ArrayList<HashMap<String, String>> getUsers()
{
ArrayList<HashMap<String, String>> usersList = new ArrayList<HashMap<String, String>>();

try {
    Socket socket = new Socket(url, 8001);
    ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
    oos.writeObject("GETUSERS");

    ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());

    usersList = (ArrayList<HashMap<String, String>>) ois.readObject();

    ois.close();
    oos.close();


} catch (UnknownHostException e) {} catch (IOException e) {} catch (ClassNotFoundException e) {}
return usersList;
}

そして、これはサーバーがそれをAndroidアプリケーション(クライアント)に送信する方法です:

else if(messageArray[0].equals("GETUSERS"))
            {
                try {
                    //st.setUserFullName(messageArray[1], messageArray[2], messageArray[3]);
                    oos.writeObject(st.getUsers());
                } catch (SQLException e) {oos.writeObject("[ERROR]");}
            }

そして、これは呼び出されるメソッドです:

public ArrayList<HashMap<String, String>> getUsers() throws SQLException
    {
        ArrayList<HashMap<String, String>> usersList = new ArrayList<HashMap<String, String>>();
        Statement statement = conn.createStatement();
        try {

            String query = "SELECT userID,username,status,fullname,lastonline FROM users";
            ResultSet resultSet = statement.executeQuery(query);
            try { 
                while (resultSet.next()) {
                    HashMap<String, String> map = new HashMap<String, String>();

                    // In Hashmap das Key und den Wert reinschreiben
                    map.put(KEY_ID, resultSet.getString("userID"));
                    map.put(KEY_USERNAME, resultSet.getString("username"));
                    map.put(KEY_STATUS, resultSet.getString("status"));
                    map.put(KEY_LASTONLINE, resultSet.getString("lastonline"));
                    map.put(KEY_THUMB_URL, resultSet.getString("thumb_url"));

                    // Hashlist in die ArrayList einfügen
                    usersList.add(map);
                }
            } finally {
                resultSet.close();
            }
        } finally {
            statement.close();
        }
        return usersList;
    }

あなたの助けに感謝します私は本当に感謝しています:)

4

1 に答える 1

1

フィールドthumb_urlがクエリにありません。したがってresultSet.getString("thumb_url"))、失敗し、サーバーは文字列を送信します。この文字列"[ERROR]"は、クライアントがリストとして逆シリアル化することはできません。

あなたはおそらく次のようなことをすることができます:

Object result = ois.readObject();
if ("[ERROR]".equals(result)) {
   // something was wrong server side
   throw SomeException();
} else {
   usersList = (ArrayList<HashMap<String, String>>) result;
}

しかし、サーバー側で例外をキャッチしない方が良いと思います

于 2013-01-07T12:13:01.967 に答える