0

Androidにクライアントサーバーアプリがあり、どちらも同じマシンで実行されています。クライアント アプリの最初のアクティビティで、サーバー アプリケーションに接続するクライアント クラスを呼び出そうとしましたが、強制終了されました。

これは、アプリの最初のアクティビティでクライアント クラスを呼び出す方法です。

Thread cThread=new Thread(new ClientThread());
cThread.start(); 

ここに私のクライアントクラスがあります:

public class ClientThread implements Runnable{
    private Handler handler=new Handler();
    Socket  socket;
    private TextView clientState;
    public void run()
    {
        try
        {
            InetAddress serverAddr=InetAddress.getByName("10.0.2.2");
            handler.post(new Runnable(){
                public void run(){
                    clientState.setText(" try to connect!");
                }
            });
        socket=new Socket(serverAddr, 8080);

            //connected=true;
        handler.post(new Runnable(){
                public void run(){
                    clientState.setText("Connected!");
                }
            });

        }
        catch(Exception e){
            handler.post(new Runnable(){
                public void run(){
                    clientState.setText("Error");
                    }
            });

            e.printStackTrace();
        }

    }

      protected void onStop() {
            super.onStop();
            try {
                 // make sure you close the socket upon exiting
                //out.close();
                 socket.close();
             } catch (IOException e) {
                 e.printStackTrace();
             }
        }

}

誰かが何が間違っているのか、少なくとも私にアイデアを教えてくれますか。私が言うべきことの1つは、クライアントが正常に動作することです-クライアントクラスが最初のアクティビティに統合されると、サーバーに接続します(つまり、最初はクライアントクラスがなく、すべてが最初のアクティビティにありました...そしてそれはうまくいきました)。詳細については、ここにいます!よろしくお願いします!

4

1 に答える 1

1

スタック トレースがないと、テキストビューを初期化しなかったためにクラッシュしたように見えます。

package com.example.helloandroid;

import android.app.Activity;
import android.os.Bundle;

public class HelloAndroid extends Activity {
    TextView tv;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        tv = (TextView)findViewById(R.id.mytextview);
    }

    public class ClientThread extends Thread {
    ...// Do NOT init textview
    }
}
于 2011-04-14T20:39:23.093 に答える