2012-04-19 96 views
3

那麼,我正在試圖製作一個應用程序,該應用程序與我已設置,測試並在簡單的Java應用程序的後臺工作的套接字進行通信。應用程序強制在啓動時關閉

問題是,我的應用程序保持馬上關閉。 fcs之前你沒有機會看到任何東西。

這是我的代碼:

import java.io.IOException; 
import java.io.PrintWriter; 
import java.net.InetAddress; 
import java.net.Socket; 
import java.net.UnknownHostException; 
import java.util.ArrayList; 
import java.util.Scanner; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.EditText; 
import android.widget.Toast; 

public class LogMeInClientActivity extends Activity { 
    private Socket s; 
    private InetAddress hostIp, localIp; 
    private final String hostName = "localhost"; 
    private final int port = 4000; 
    private Scanner in; 
    private PrintWriter out; 
    private final EditText usernameField = (EditText)  findViewById(R.id.username_field), 
      passwordField = (EditText) findViewById(R.id.password_field); 
    private String username, password; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     System.out.println("A"); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     System.out.println("B"); 
     try { 
      hostIp = InetAddress.getByName(hostName); 
      localIp = InetAddress.getLocalHost(); 
      System.out.println("Local Ip: " + localIp.toString()); 
      System.out.println("Host Ip: " + hostIp.toString()); 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } 
     try { 
      s = new Socket(hostIp, port); 
      out = new PrintWriter(s.getOutputStream(), true); 
      in = new Scanner(s.getInputStream()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    private class SignInButtonListener implements OnClickListener { 

     public void onClick(View clickedButton) { 
      switch (clickedButton.getId()) { 
      case R.id.sign_in: 
       username = usernameField.getText().toString(); 
       password = passwordField.getText().toString(); 
       if (username.length() != 0 && password.length() != 0) { 
        out.println(username); 
        out.println(password); 
       } 
       out.flush(); 
       break; 

      default: 
       break; 
      } 
     } 
    } 
} 

在上面的代碼中,既不是 「A」 或 「B」 打印出來。應用程序只是fc的。

這裏是我的清單:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.chriswins2much.Util" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk android:minSdkVersion="15" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <activity 
      android:name=".LogMeInClientActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

我用了上面的權限,因爲我聽到這將有助於它。

我更新的代碼來解決了的EditText NullPointerException異常修復(只改部分):下面

private EditText usernameField, passwordField; 
public void onCreate(Bundle savedInstanceState) { 
     System.out.println("A"); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     usernameField = (EditText) findViewById(R.id.username_field); 
     passwordField = (EditText) findViewById(R.id.password_field); 
     System.out.println("B"); 
     try { 
        // It's saying one of the errors are on line 37 (directly below) 
      hostIp = InetAddress.getByName(hostName); 
      localIp = InetAddress.getLocalHost(); 
      System.out.println("Local Ip: " + localIp.toString()); 
      System.out.println("Host Ip: " + hostIp.toString()); 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } 
     try { 
      s = new Socket(hostIp, port); 
      out = new PrintWriter(s.getOutputStream(), true); 
      in = new Scanner(s.getInputStream()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

新的logcat:

04-19 02:46:56.292: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:46:57.049: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:46:57.103: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:46:57.450: E/dalvikvm(1289): Unable to open stack trace file '/data/anr/traces.txt': Permission denied 
04-19 02:46:57.462: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:46:57.669: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:46:58.069: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:46:58.409: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:46:58.650: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:46:58.779: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:46:59.009: I/System.out(1289): A 
04-19 02:46:59.153: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:46:59.321: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:46:59.639: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:46:59.879: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:47:00.249: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:47:00.490: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:47:00.819: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:47:00.970: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:47:01.279: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:47:01.477: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:47:01.791: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:47:01.919: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:47:02.302: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:47:02.443: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:47:02.811: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:47:02.999: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:47:03.409: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:47:03.583: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:47:03.870: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:47:04.029: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:47:04.410: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:47:04.529: I/System.out(1289): B 
04-19 02:47:04.603: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:47:04.850: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:47:05.020: D/AndroidRuntime(1289): Shutting down VM 
04-19 02:47:05.020: W/dalvikvm(1289): threadid=1: thread exiting with uncaught exception (group=0x409c01f8) 
04-19 02:47:05.101: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:47:05.460: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:47:05.510: E/AndroidRuntime(1289): FATAL EXCEPTION: main 
04-19 02:47:05.510: E/AndroidRuntime(1289): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.chriswins2much.Util/com.chriswins2much.Util.LogMeInClientActivity}: android.os.NetworkOnMainThreadException 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at android.app.ActivityThread.access$600(ActivityThread.java:123) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at android.os.Looper.loop(Looper.java:137) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at android.app.ActivityThread.main(ActivityThread.java:4424) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at java.lang.reflect.Method.invoke(Method.java:511) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at dalvik.system.NativeStart.main(Native Method) 
04-19 02:47:05.510: E/AndroidRuntime(1289): Caused by: android.os.NetworkOnMainThreadException 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at java.net.InetAddress.lookupHostByName(InetAddress.java:391) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at java.net.InetAddress.getByName(InetAddress.java:295) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at com.chriswins2much.Util.LogMeInClientActivity.onCreate(LogMeInClientActivity.java:37) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at android.app.Activity.performCreate(Activity.java:4465) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 
04-19 02:47:05.510: E/AndroidRuntime(1289):  ... 11 more 
04-19 02:47:05.779: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 
04-19 02:47:06.839: I/dalvikvm(1289): threadid=3: reacting to signal 3 
04-19 02:47:07.000: I/dalvikvm(1289): Wrote stack traces to '/data/anr/traces.txt' 

! 注意:這是一個新的,新的更新代碼。部隊關閉是固定的!謝謝你idiottiger! 雖然仍然存在問題。它沒有連接到我在java中設置localhost:4000的端口。我試過非Android,它工作正常。這裏是我的代碼來解決力閉合:

public void onCreate(View v){ 
    // Code... 
     new Thread(new Runnable() { 
      public void run(){ 
       try { 
        hostIp = InetAddress.getByName(hostName); 
        localIp = InetAddress.getLocalHost(); 
        System.out.println("Local Ip: " + localIp.toString()); 
        System.out.println("Host Ip: " + hostIp.toString()); 
       } catch (UnknownHostException e) { 
        e.printStackTrace(); 
       } 
       try { 
        s = new Socket(hostIp, port); 
        out = new PrintWriter(s.getOutputStream(), true); 
        in = new Scanner(s.getInputStream()); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }).start(); 


} 

低於新的logcat(它的後半期):

04-19 03:38:02.920: I/System.out(1490): Local Ip: localhost/127.0.0.1 
04-19 03:38:03.099: I/System.out(1490): Host Ip: localhost/127.0.0.1 
04-19 03:38:05.420: W/System.err(1490): java.net.ConnectException: failed to connect to localhost/127.0.0.1 (port 4000): connect failed: ECONNREFUSED (Connection refused) 
04-19 03:38:05.711: W/System.err(1490):  at libcore.io.IoBridge.connect(IoBridge.java:114) 
04-19 03:38:05.711: W/System.err(1490):  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 
04-19 03:38:05.781: W/System.err(1490):  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) 
04-19 03:38:05.781: W/System.err(1490):  at java.net.Socket.startupSocket(Socket.java:566) 
04-19 03:38:05.803: W/System.err(1490):  at java.net.Socket.<init>(Socket.java:225) 
04-19 03:38:05.809: W/System.err(1490):  at com.chriswins2much.Util.LogMeInClientActivity$1.run(LogMeInClientActivity.java:48) 
04-19 03:38:05.839: W/System.err(1490):  at java.lang.Thread.run(Thread.java:856) 
04-19 03:38:05.859: W/System.err(1490): Caused by: libcore.io.ErrnoException: connect failed: ECONNREFUSED (Connection refused) 
04-19 03:38:05.925: W/System.err(1490):  at libcore.io.Posix.connect(Native Method) 
04-19 03:38:05.939: W/System.err(1490):  at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85) 
04-19 03:38:05.979: W/System.err(1490):  at libcore.io.IoBridge.connectErrno(IoBridge.java:127) 
04-19 03:38:05.979: W/System.err(1490):  at libcore.io.IoBridge.connect(IoBridge.java:112) 
04-19 03:38:05.989: W/System.err(1490):  ... 6 more 
04-19 03:38:06.692: D/gralloc_goldfish(1490): Emulator without GPU emulation detected. 
+0

此行是導致錯誤: passwordField =(EditText上)findViewById(R.id.password_field);學習如何閱讀堆棧跟蹤,它會告訴你這個(即「由......引起」) – 2012-04-19 02:40:09

+0

它仍然沒有工作,但是,我以前沒有看到。預先感謝未來的問題,它可能會救我。 – chriswins2much 2012-04-19 03:07:10

+0

正在處理平板電腦應用程序NetworkOnMainThread異常將發生。嘗試從另一個比ui線程area.Try訪問http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception並在您的代碼中添加嚴格模式。 – 2012-04-19 03:35:54

回答

16

好的......顯然這是'localhost'的東西。 Android在另一個子網上運行,併爲其自身保留127.0.0.1,所以當我試圖連接到我在localhost:4000上設置的服務器時,我調用了Android的保留本地主機IP爲127.0.0.1,而計算機的本地主機IP更改爲10.0.2.2在端口4000上。

此修復程序是否實施?原因很簡單:

我改變了這種

private final String hostName = "localhost"; 

這個

private final String hostName = "10.0.2.2"; 

或者,如果我有它試圖在我的IP地址(而不是本地主機之一),那麼它應該有工作,以及。

0

這些代碼可能是有一些問題:

private final EditText usernameField = (EditText) findViewById(R.id.username_field), 
      passwordField = (EditText) findViewById(R.id.password_field); 

該視圖需要初始化後setContentView,所以更改爲:

private EditText usernameField,passwordField; 
setContentView

添加如下代碼:

usernameField = (EditText) findViewById(R.id.username_field), 
passwordField = (EditText) findViewById(R.id.password_field); 

,如果它不能修復您的問題,您需要檢查視圖id:R.id.username_fieldR.id.password_field存在於你的main.xml文件或沒有。

更新:

你新的錯誤:NetworkOnMainThreadException

This is only thrown for applications targeting the Honeycomb SDK or higher. Applications targeting earlier SDK versions are allowed to do networking on their main event loop threads, but it's heavily discouraged. See the document Designing for Responsiveness.

像你InetAddress.getByName需要阻止main thread,所以儘量在另一個線程使用,或者改變SDK的目標版本低,如:< 11(android 3.0)

此外,您需要在您的xml中添加網絡權限:

<uses-permission android:name="android.permission.INTERNET" /> 
+0

它仍然在發生! D: – chriswins2much 2012-04-19 02:49:34

+0

您是否可以使用新代碼進行更新並粘貼新的錯誤消息? – idiottiger 2012-04-19 02:50:47

+0

謝謝。我現在正在嘗試。 – chriswins2much 2012-04-19 03:37:50

0

我認爲你正在使用與互聯網相關的東西。我沒有看到你的清單文件的權限。

<uses-permission android:name="android.permissions.INTERNET" /> 
+0

我將它添加到清單,但它仍然給我相同的確切logcat thingy。我的意思完全相同。 – chriswins2much 2012-04-19 03:18:22

+0

我認爲這是行37的事情,但我不知道 – chriswins2much 2012-04-19 03:20:00

+0

哦對不起。它的權限沒有權限 – 2012-04-19 03:21:31

0

你的問題是AndroidManifest.xml中

如果你改變了
使用-SDK安卓的minSdkVersion = 「15」 來使用-SDK安卓的minSdkVersion = 「8」 程序就可以了。

我不知道這樣