-1

私と何人かの友人が Java でチャット プログラムを作成し、それを Android アプリにしたいと考えました。今日は基本的な機能だけから始めました。実行しようとすると、「残念ながらあなたのアプリがクラッシュしました」などとクラッシュします。

Main.java

package com.Linkr.linkrandroid;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;

import static com.Linkr.linkrandroid.R.*;

public class Chat extends Activity {

    String username;
    Socket sock;
    BufferedReader reader;
    PrintWriter writer;
    ArrayList<String> userList = new ArrayList();
    //Boolean isConnected = false;
    TextView chatTextArea = (TextView) findViewById(R.id.chatTextArea);
    TextView inputTextArea = (TextView) findViewById(id.inputTextArea);
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(layout.activity_chat);
        this.setTitle("Linkr");

    }


public class IncomingReader implements Runnable{

    public void run() {
        String[] data;
        String stream, done = "Done", connect = "Connect", disconnect = "Disconnect", chat = "Chat";

        try {
            while ((stream = reader.readLine()) != null) {

                data = stream.split(":");

                if (data[2].equals(chat)) {

                    chatTextArea.append(data[0] + ": " + data[1] + "\n");
                    //chatTextArea.setCaretPosition(chatTextArea.getDocument().getLength());

                } else if (data[2].equals(connect)){

                    //chatTextArea.removeAll();
                    //userAdd(data[0]);

                } else if (data[2].equals(disconnect)) {


                    //userRemove(data[0]);

                } else if (data[2].equals(done)) {


                    /*usersList.setText("");
                    writeUsers();
                    userList.clear();
                    */

                }

            }
        }catch(Exception ex) {
        }
    }
}

public void ListenThread() {
    Thread IncomingReader = new Thread(new IncomingReader());
    IncomingReader.start();
}
public void userAdd(String data) {
    userList.add(data);

}

public void userRemove(String data) {
    chatTextArea.append(data + " has disconnected.\n");

}

public void writeUsers() {
    String[] tempList = new String[(userList.size())];
    userList.toArray(tempList);
    /*for (String token:tempList) {

        usersList.append(token + "\n");

    }
    */

}

public void sendDisconnect() {

    String bye = (username + ": :Disconnect");
    try{
        writer.println(bye); // Sends server the disconnect signal.
        writer.flush(); // flushes the buffer
    } catch (Exception e) {
        chatTextArea.append("Could not send Disconnect message.\n");
    }

}
public void Disconnect() {

    try {
        chatTextArea.append("Disconnected.\n");
        sock.close();
    } catch(Exception ex) {
        chatTextArea.append("Failed to disconnect. \n");
    }
    isConnected = false;
    //usersList.setText("");

}
private void onClickButton(View view) {
    String nothing = "";
    if ((inputTextArea.getText()).equals(nothing)) {
        inputTextArea.setText("");
        inputTextArea.requestFocus();
    } else {
        try {
            writer.println(username + ":" + inputTextArea.getText() + ":" + "Chat");
            writer.flush(); // flushes the buffer
        } catch (Exception ex) {
            chatTextArea.append("Message was not sent. \n");
        }
        inputTextArea.setText("");
        inputTextArea.requestFocus();
    }

    inputTextArea.setText("");
    inputTextArea.requestFocus();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.chat, menu);
    return true;
}

}

アクティビティ_チャット.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".Chat">
android:text = "Linkr"

<EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/inputTextArea"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_toLeftOf="@+id/onClickButton"/>

<Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Send"
        android:id="@+id/onClickButton"
        android:layout_below="@+id/chatTextArea"
        android:layout_alignRight="@+id/chatTextArea"/>

<EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="textMultiLine"
        android:ems="10"
        android:id="@+id/chatTextArea"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_above="@+id/inputTextArea"
        android:layout_alignParentRight="true"/>

助けてくれてありがとう!<3

4

1 に答える 1

2

これらの行はあなたの犯人です

TextView chatTextArea = (TextView) findViewById(R.id.chatTextArea);
TextView inputTextArea = (TextView) findViewById(id.inputTextArea);

前に初期化することはできません。setContentView()または、次のようにメソッドを呼び出そうとすると返さnullNPEますsetText()

のように変更してみてください

TextView chatTextArea; 
TextView inputTextArea; 

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(layout.activity_chat);
    chatTextArea; = (TextView) findViewById(R.id.chatTextArea);
    inputTextArea; = (TextView) findViewById(id.inputTextArea);
    this.setTitle("Linkr");

UIまた、ここのバックグラウンド スレッドで要素を更新しようとしているようです

chatTextArea.append

は でのみ更新できUIますUI ThreadAsyncTaskを調べることをお勧めします。これによりAsyncTask、ネットワークに関するすべての作業を実行してから、他の方法でdoInBackground()更新できます。UIドキュメントを注意深く読んでください。難しいかもしれませんが、一度手に入れると、人生はずっと楽になります。

また、SO に投稿するときに、アプリがクラッシュした場合は logcat を投稿してください。これにより、一般的に人々が助けやすくなります。

于 2013-07-24T20:39:55.663 に答える