user1334069
user1334069

Reputation:

Application Force Closes On Startup

Well, I am trying to make an app that communicates with a socket I have set up, tested, and made work in the background of a simple java application.

The problem is, my app keeps force closing right away. You don't get a chance to see anything before it fcs.

Here is my code:

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;
            }
        }
    }
}

In the above code, neither "A" or "B" prints out. The application simply fc's.

Here is my manifest:

<?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>

I used the above permission, because I heard it would help for it.

I updated the code to fix for the EditText NullPointerException fix (Only changed parts):

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();
        }
    }

New logcat below:

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'

! Note: Here is a new, new updated code. Force closes are fixed!!! Thank you idiottiger! There is still a problem though. It's not connecting to the port I have set up on localhost:4000 in java. I've tried it non-Android and it works fine. Here is my code to fix the Force close:

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();


}

New logcat below (the latter half of it):

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.

Upvotes: 3

Views: 11196

Answers (4)

user2020453
user2020453

Reputation: 1

your question is AndroidManifest.xml

if you change your
uses-sdk android:minSdkVersion="15" to uses-sdk android:minSdkVersion="8" the program is ok.

i don't know way

Upvotes: 0

user1334069
user1334069

Reputation:

OK... Apparently it was the 'localhost' thing. Android runs on another subnet and reserves 127.0.0.1 for itself, so when I tried to connect to the server I set up on localhost:4000, I was calling Android's reserved localhost ip of 127.0.0.1, while the computer's localhost ip was changed to 10.0.2.2 on port 4000.

The fix implemented? It's simple:

I changed this

private final String hostName = "localhost";

to this

private final String hostName = "10.0.2.2";

Or if I had tried it to my ip address (not the localhost one), then it should have worked as well.

Upvotes: 16

idiottiger
idiottiger

Reputation: 5177

these code may be have some problem:

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

the view need init after setContentView, so change to this:

private EditText usernameField,passwordField;

add follow code after setContentView:

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

if it can't fix your problem, you need check the view id: R.id.username_field and R.id.password_field existed in your main.xml file or not.

update:

you new error: 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.

it like you InetAddress.getByName need block the main thread, so try to use in another thread, or change the sdk target version to low like: < 11 (android 3.0)

also , you need add the network permission in your xml:

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

Upvotes: 0

Seshu Vinay
Seshu Vinay

Reputation: 13588

I think you are using something related to internet. and i didnt see permission for that in your manifest file.

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

Upvotes: 0

Related Questions