0

SocketService.java:

public class SocketService extends Service {
    int mStartMode;
    IBinder mBinder = new LocalBinder();
    boolean mAllowRebind;
    String IPValue;
    String PortValue;
    Socket socket;
    byte data[];


    public class LocalBinder extends Binder {
        public SocketService getServerInstance() {
            return SocketService.this;
        }
    }


    @Override
    public void onCreate() {
        System.out.println("SERVICE CREATED");
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        IPValue = sharedPreferences.getString("IPValue", "NA");
        PortValue = sharedPreferences.getString("PortValue", "NA");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        System.out.println("SERVICE ONSTARTCOMMAND");
        return mStartMode;
    }

    @Override
    public IBinder onBind(Intent intent) {
        System.out.println("SERVICE BOUND");

        try {
            InetAddress serverAddr = null;
            serverAddr = InetAddress.getByName(IPValue);
            int serverPort = Integer.parseInt(PortValue);
            System.out.println(serverAddr.getHostAddress() + serverPort);
            socket = new Socket(serverAddr, serverPort);

        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return mBinder;
    }

    public void send_mesage(String msg) {
        PrintWriter out = null;
        try {
            out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
                    socket.getOutputStream())), true);
            out.println(msg);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

で IP とポートを取得し、onCreateでソケット接続を作成しましたonBind

今私の活動で:

public class MainActivity extends Activity {

    public String IPValue;
    public String PortValue;
    public Socket socket;
    boolean mBounded;
    SocketService mServer;

    ServiceConnection mConnection = new ServiceConnection() {
        public void onServiceDisconnected(ComponentName name) {
            Toast.makeText(MainActivity.this, "Service is disconnected", 1000).show();
            mBounded = false;
            mServer = null;
        }

        public void onServiceConnected(ComponentName name, IBinder service) {
            Toast.makeText(MainActivity.this, "Service is connected", 1000).show();
            mBounded = true;
            SocketService.LocalBinder mLocalBinder = (SocketService.LocalBinder)service;
            mServer = mLocalBinder.getServerInstance();
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent mIntent = new Intent(this, SocketService.class);
        bindService(mIntent, mConnection, BIND_AUTO_CREATE);

    }

これは完全に機能します.TCPサーバーは接続を作成済みとして表示します.

send_message()ここで、内のメソッドにアクセスしたいと思いましたSocketService。そのため、Activity のmServer.send_mesage("HELLO WORLD!");afterbindService(mIntent, mConnection, BIND_AUTO_CREATE);に単純に追加しました。onCreate()

しかし、これによりすべてが崩壊します。サーバーとアプリの FC で接続が確立されていません。ログは次のとおりです。

10-21 15:37:33.945    9125-9125/com.example.myfirstapp D/dalvikvm﹕ GC_EXTERNAL_ALLOC freed 54K, 50% free 2694K/5379K, external 0K/0K, paused 313ms
10-21 15:37:48.985    9125-9125/com.example.myfirstapp D/AndroidRuntime﹕ Shutting down VM
10-21 15:37:48.985    9125-9125/com.example.myfirstapp W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x40018560)
10-21 15:37:49.015    9125-9125/com.example.myfirstapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myfirstapp/com.example.myfirstapp.MainActivity}: java.lang.NullPointerException
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1768)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784)
            at android.app.ActivityThread.access$1500(ActivityThread.java:123)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:130)
            at android.app.ActivityThread.main(ActivityThread.java:3835)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:507)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NullPointerException
            at com.example.myfirstapp.MainActivity.onCreate(MainActivity.java:57)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784)
            at android.app.ActivityThread.access$1500(ActivityThread.java:123)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:130)
            at android.app.ActivityThread.main(ActivityThread.java:3835)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:507)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
            at dalvik.system.NativeStart.main(Native Method)

追加したばかりの新しい行に NullPointerException があります!

この問題の原因がわかりません! 奇妙なことに、サービスのメソッドonCreateonBindメソッドは、今回は呼び出されていないようです。それぞれに入力した print ステートメントの出力が表示されないためです。

何か助けはありますか?

4

1 に答える 1

0

mServer は、コールバック onServiceConnected() が起動するまで null です。前の行でバインドするように指示しましたが、バインドに時間がかかります。mServer を参照するには、コールバックが終わるまで待つ必要があります。

于 2013-10-21T10:50:07.180 に答える