2012-04-19 3 views
3

Ну, я пытаюсь создать приложение, которое связывается с сокетом, который я настроил, протестировал и сделал работу на фоне простого java-приложения.Application Force Closes On Startup

Проблема в том, что мое приложение сразу же закрывает силу. У вас не будет возможности увидеть что-либо до этого 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; 
      } 
     } 
    } 
} 

В приведенном выше коде, ни «А» или «В» печатает. Приложение просто 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' 

! Примечание. Вот новый, новый обновленный код. Фиксированные закрытия фиксированы !!! Спасибо, идиоттигер! Все еще есть проблема. Он не подключается к порту, который я установил на localhost: 4000 в java. Я пробовал это не Android, и он отлично работает. Вот мой код, чтобы установить закрывающий Force:

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); Узнайте, как читать трассировку стека, он скажет вам это (т. Е. «Причиненный:») –

+0

Это все еще не работает, но да, я этого раньше не видел. Заранее спасибо за будущие проблемы, это может спасти меня. – chriswins2much

+0

Работает над приложением для планшета. Вызывается NetworkOnMainThread Exception. Попробуйте позвонить из другого, кроме области нитей u.Попробуйте посетить http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception и добавить Strict Mode в свой код. –

ответ

16

ОК ... Видимо, это была вещь «localhost». Android работает в другой подсети и резервирует 127.0.0.1 для себя, поэтому, когда я попытался подключиться к серверу, который я установил на localhost: 4000, я вызывал зарезервированный localhost ip Android 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_field и R.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

+0

можете ли вы обновить с помощью нового кода и вставить новое сообщение об ошибке? – idiottiger

+0

Спасибо. Я сейчас пытаюсь. – chriswins2much

0

Я думаю, вы используете что-то, связанное с Интернетом.и я не видел разрешения для этого в вашем файле манифеста.

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

Я добавил его к манифесту, но он все равно дает мне то же самое, что и лог-бит. Я имею в виду то же самое. – chriswins2much

+0

Я думаю, что это дело 37, но я не уверен – chriswins2much

+0

о, извините. его разрешение не разрешает –

0

ваш вопрос AndroidManifest.xml

если вы измените
использует-SDk андроида: minSdkVersion = "15" для использования-SDk андроида: minSdkVersion = "8" программа нормально.

я не знаю способ