在真实设备上运行的Android应用程序崩溃

在真实设备上运行的Android应用程序崩溃,android,eclipse,Android,Eclipse,我试图在设备上运行我的android应用程序,但登录失败。logcat将显示此错误 09-12 21:32:12.289: E/AudioHardwareALSA(149): RE-OPEN AFTER STANDBY:: took 115 msecs 09-12 21:32:12.319: E/AndroidRuntime(4760): FATAL EXCEPTION: main 09-12 21:32:12.319: E/AndroidRuntime(4760): android.os.Ne

我试图在设备上运行我的android应用程序,但登录失败。logcat将显示此错误

09-12 21:32:12.289: E/AudioHardwareALSA(149): RE-OPEN AFTER STANDBY:: took 115 msecs
09-12 21:32:12.319: E/AndroidRuntime(4760): FATAL EXCEPTION: main
09-12 21:32:12.319: E/AndroidRuntime(4760): android.os.NetworkOnMainThreadException
09-12 21:32:12.319: E/AndroidRuntime(4760):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
09-12 21:32:12.319: E/AndroidRuntime(4760):     at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
09-12 21:32:12.319: E/AndroidRuntime(4760):     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
09-12 21:32:12.319: E/AndroidRuntime(4760):     at java.net.InetAddress.getAllByName(InetAddress.java:220)
09-12 21:32:12.319: E/AndroidRuntime(4760):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
09-12 21:32:12.319: E/AndroidRuntime(4760):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
09-12 21:32:12.319: E/AndroidRuntime(4760):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
09-12 21:32:12.319: E/AndroidRuntime(4760):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
09-12 21:32:12.319: E/AndroidRuntime(4760):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
09-12 21:32:12.319: E/AndroidRuntime(4760):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
09-12 21:32:12.319: E/AndroidRuntime(4760):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
09-12 21:32:12.319: E/AndroidRuntime(4760):     at com.stts.sparetimetradingsystem.library.JSONParser.getJSONFromUrl(JSONParser.java:44)
09-12 21:32:12.319: E/AndroidRuntime(4760):     at com.stts.sparetimetradingsystem.library.UserFunctions.loginUser(UserFunctions.java:40)
09-12 21:32:12.319: E/AndroidRuntime(4760):     at com.stts.sparetimetradingsystem.LoginActivity$Login$1.run(LoginActivity.java:125)
09-12 21:32:12.319: E/AndroidRuntime(4760):     at android.os.Handler.handleCallback(Handler.java:605)
09-12 21:32:12.319: E/AndroidRuntime(4760):     at android.os.Handler.dispatchMessage(Handler.java:92)
09-12 21:32:12.319: E/AndroidRuntime(4760):     at android.os.Looper.loop(Looper.java:137)
09-12 21:32:12.319: E/AndroidRuntime(4760):     at android.app.ActivityThread.main(ActivityThread.java:4424)
09-12 21:32:12.319: E/AndroidRuntime(4760):     at java.lang.reflect.Method.invokeNative(Native Method)
09-12 21:32:12.319: E/AndroidRuntime(4760):     at java.lang.reflect.Method.invoke(Method.java:511)
09-12 21:32:12.319: E/AndroidRuntime(4760):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
09-12 21:32:12.319: E/AndroidRuntime(4760):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
09-12 21:32:12.319: E/AndroidRuntime(4760):     at dalvik.system.NativeStart.main(Native Method)
我哪里做错了

编辑

这是我的登录代码,它位于异步任务中,我可以知道我的异步任务是否正确编码:

// Background ASYNC Task to login by making HTTP Request
class Login extends AsyncTask<String, String, String> {

    // Before starting background thread Show Progress Dialog
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(LoginActivity.this);
        pDialog.setMessage("Authenticating...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    // Checking login in background
    protected String doInBackground(String... params) {
        runOnUiThread(new Runnable() {
            public void run() {

                String email = inputEmail.getText().toString();
                String password = inputPassword.getText().toString();
                UserFunctions userFunction = new UserFunctions();
                JSONObject json = userFunction.loginUser(email, password);

                // check for login response
                try {
                    if (json.getString(KEY_SUCCESS) != null) {
                        loginErrorMsg.setText("");
                        String res = json.getString(KEY_SUCCESS);
                        if (Integer.parseInt(res) == 1) {
                            validUser = true;
                            // user successfully logged in
                            // Store user details in SQLite Database
                            DatabaseHandler db = new DatabaseHandler(
                                    getApplicationContext());
                            JSONObject json_user = json
                                    .getJSONObject("user");

                            // Clear all previous data in database
                            userFunction
                                    .logoutUser(getApplicationContext());
                            db.addUser(json_user.getString(KEY_NAME),
                                    json_user.getString(KEY_EMAIL),
                                    json.getString(KEY_UID),
                                    json_user.getString(KEY_CREATED_AT));
                        } else {
                            // Error in login
                            loginErrorMsg
                                    .setText("Incorrect username/password");
                        }
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }

            }
        });
        return null;
    }

    // After completing background task Dismiss the progress dialog
    protected void onPostExecute(String file_url) {
        // dismiss the dialog once done
        pDialog.dismiss();
        if (validUser == true) {
            loginErrorMsg.setText("");
            // Launch HomePage Screen
            Intent homepage = new Intent(getApplicationContext(),
                    HomepageActivity.class);

            // Close all views before launching HomePage
            homepage.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(homepage);

            // Close Login Screen
            finish();
        }
    }
}

从Android 3.0Honeycomb开始,Android不允许在主线程上进行网络调用。 因此,您必须使用Asynctask进行网络调用


要解决这个问题,您需要使用AsynTask进行网络调用。

从Android 3.0Honeycom开始,Android不允许在主线程上进行网络调用。 因此,您必须使用Asynctask进行网络调用


要解决此问题,您需要使用AsynTask进行网络调用。

您使用的是AsyncTask,但在您的doInBackground中,您实际上是通过以下方式执行网络代码:

 runOnUiThread(new Runnable() { }

这就是为什么会出现这种异常的原因,您需要在没有这种异常的情况下执行网络代码。我猜您这样做是为了引用应用程序上下文,但通过AsyncTask构造函数提供它相当简单。

您使用的是AsyncTask,但在您的doInBackground中,您实际上是通过以下方式执行网络代码:

 runOnUiThread(new Runnable() { }


这就是为什么会出现这种异常的原因,您需要在没有这种异常的情况下执行网络代码。我猜您这样做是为了引用应用程序上下文,但通过AsyncTask构造函数提供它相当简单。

请切换到async task以执行nw操作如果您在UIThread上运行NetworkOperations时尝试在主线程中运行网络操作,这在android 3.0+中可以找到。如异常名称中所述。我的登录名在async task Already中。设备的android版本是什么?请切换到async task以执行nw操作。如果在UIThread上运行NetworkOperations时尝试在主线程中运行网络操作,则在android 3.0+中可以找到此选项。如异常名称中所述。我的登录名在async task Already中。设备的android版本是什么?请参阅我的编辑。我是android新手。很抱歉,我对它有所了解。您是基于2.3.3编写应用程序的,在此版本中,android允许在主threadUI上进行网络调用。但是从android 3.0开始,它不允许在UI线程上进行网络调用。因此,如果你在运行3.0或更高版本的设备上运行你的应用程序,你会得到这个例外。嗯,所以我只是删除runOnUIthread来解决这个问题?是的,你需要删除runOnUIthread,那么它只会在异步任务上执行你的操作。这将解决问题。请参阅我的编辑。我是android新手。很抱歉,我对它有所了解。您是基于2.3.3编写应用程序的,在此版本中,android允许在主threadUI上进行网络调用。但是从android 3.0开始,它不允许在UI线程上进行网络调用。因此,如果你在运行3.0或更高版本的设备上运行你的应用程序,你会得到这个例外。嗯,所以我只是删除runOnUIthread来解决这个问题?是的,你需要删除runOnUIthread,那么它只会在异步任务上执行你的操作。这将解决问题。这意味着我只需删除doInBackground中的代码?是的,您需要删除runOnUiThread位,并直接在doInBackground方法中执行代码。我发现您可能访问视图值EditText,并从AsyncTask更新它们。您应该在UI线程中执行的preExecute、postExecute和progressUpdate方法中这样做。在doInBackground方法中避免所有这些。这意味着我从文本字段获取用户输入必须在postExecute中?显然,您需要用户输入来执行登录,所以请在preExecute中执行。在postExecute中,如果需要,您可以在doInBackground方法中更新错误消息。如果登录成功,您可以启动新活动。这意味着我只需删除doInBackground中的代码?是,您需要删除runOnUiThread位,并直接在doInBackground方法中执行代码。我发现您可能会访问视图值EditText,并从AsyncTask中更新它们。您应该在UI线程中执行的preExecute、postExecute和progressUpdate方法中这样做。在doInBackground方法中避免所有这些。这意味着我从文本字段获取用户输入必须在postExecute中?显然,您需要用户输入来执行登录,所以请在preExecute中执行。在postExecute中,如果需要,您可以更新错误消息—您现在正在doInBackground方法中执行此操作,如果登录成功—您已经在执行此操作—则启动新活动。