2013-10-21 120 views
0

SocketService.java:麻烦结合TCP服务

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服务器显示连接创建为

现在我想访问SocketService里面的send_message()方法。 所以我简单地在我的活动的onCreate()之后bindService(mIntent, mConnection, BIND_AUTO_CREATE);之后加了mServer.send_mesage("HELLO WORLD!");

但是这会导致一切崩溃。我的连接没有建立在我的服务器和应用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语句的输出。

任何帮助?

+0

MainActivity的第57行是什么? – Squonk

+0

这是我刚刚添加的调用'send_message'的新行。 – user1265125

回答

0

直到回调函数onServiceConnected()触发时,mServer为null。虽然你已经告诉它绑定在上一行,但绑定需要时间。您必须等到回拨之后才能参考mServer

+0

啊。说得通。虽然我无法弄清楚如何解决这个问题。你能指出几个例子吗? – user1265125

+0

假设你想发送消息来响应按钮按下或某个事件,在你编辑完消息之后,所以在按钮onClick时只需检查mServer是否为空,然后发送消息。 (并且不要在主线程上执行它!否则你会得到一个NetworkOnMainThreadException) – NickT