android.os. NetworkOnMainThreadException в андроиде 4.0

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;

public class Signin extends Activity {

    EditText edt_mail, edt_password;
    Button btn_login, btn_pass, btn_reg, btn_forget;
    ImageView iv1, iv2;
    String strmail, strpassword, strres;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.signin);

        btn_forget = (Button) findViewById(R.id.btnforget);

        edt_mail = (EditText) findViewById(R.id.edt_Username);
        edt_password = (EditText) findViewById(R.id.edt_Password);

        btn_login = (Button) findViewById(R.id.btnlogin);
        btn_pass = (Button) findViewById(R.id.btncancel);
        btn_reg = (Button) findViewById(R.id.btnReg);
        iv1 = (ImageView) findViewById(R.id.imgfacebook);
        iv2 = (ImageView) findViewById(R.id.imgtwitter);
        btn_forget.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
               //TODO Auto-generated method stub
                Intent intent = new Intent(Signin.this, ForgetPassword.class);
                startActivity(intent);

            }
        });
        iv2.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
               //TODO Auto-generated method stub
                Intent intent = new Intent(Signin.this, Twitter.class);
                startActivity(intent);

            }
        });
        iv1.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
               //TODO Auto-generated method stub
                Intent intent = new Intent(Signin.this, Facebook.class);
                startActivity(intent);

            }
        });

        btn_reg.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
               //TODO Auto-generated method stub
                Intent intent = new Intent(Signin.this, Signup.class);
                startActivity(intent);
            }
        });
        btn_pass.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {//TODO Auto-generated method stub

                cleartext();
            }

            public void cleartext() {//TODO Auto-generated method stub

                edt_mail.setText("");
                edt_password.setText("");
            }
        });

        btn_login.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
               //TODO Auto-generated method stub
                if (!edt_mail.getText().toString().equals("")) {

                    if (!edt_password.getText().toString().equals("")) {

                        try {
                            if (CheckConnection()) {
                               //new GetAccess().execute("");
                                getLogin();
                            } else {
                                Toast.makeText(
                                        Signin.this,
                                        "Please check your internet connection",
                                        Toast.LENGTH_LONG).show();
                            }

                        } catch (Exception e) {
                            Toast.makeText(Signin.this,
                                    "Error caught = " + e.toString(),
                                    Toast.LENGTH_LONG).show();
                        }

                    } else {

                        Toast.makeText(Signin.this, "please enter Password",
                                Toast.LENGTH_LONG).show();
                    }
                } else {
                    Toast.makeText(Signin.this, "please enter Username",
                            Toast.LENGTH_LONG).show();

                }

            }

            private boolean CheckConnection() {
                final ConnectivityManager conMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
                final NetworkInfo activeNetwork = conMgr.getActiveNetworkInfo();
                if (activeNetwork != null
                        && activeNetwork.getState() == NetworkInfo.State.CONNECTED) {
                   //notify user you are online
                   //System.out.println("Internet connected = 1");
                    return true;

                } else {
                   //notify user you are not online
                   //System.out.println("Internet not connected = 0");
                    Toast.makeText(getApplicationContext(),
                            "Please check your internet connection ",
                            Toast.LENGTH_SHORT).show();
                    return false;

                }
            }
        });

    }

    public boolean CheckConnection() {
        final ConnectivityManager conMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        final NetworkInfo activeNetwork = conMgr.getActiveNetworkInfo();
        if (activeNetwork != null
                && activeNetwork.getState() == NetworkInfo.State.CONNECTED) {
           //notify user you are online
           //System.out.println("Internet connected = 1");
            return true;
        } else {
           //notify user you are not online
            System.out.println("Internet not connected = 0");
            Toast.makeText(getApplicationContext(),
                    "Please check your internet connection ",
                    Toast.LENGTH_SHORT).show();
            return false;

        }

    }

    private void loadList() {

        /*
         * ArrayAdapter adapter = new ArrayAdapter(
         * MainActivity.this, android.R.layout.simple_list_item_1, eventlist);
         * view.setAdapter(adapter);
         */

        Intent intent = new Intent(Signin.this, MainList.class);
        startActivity(intent);

    }

    public void getLogin() {

        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(
                "my link");
        try {
            List nameValuePairs = new ArrayList(2);
           //nameValuePairs.add(new BasicNameValuePair("id", "12345"));
            nameValuePairs.add(new BasicNameValuePair("email", edt_mail
                    .getText().toString().trim()));
            nameValuePairs.add(new BasicNameValuePair("password", edt_password
                    .getText().toString().trim()));

            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            HttpResponse httpResponse = httpclient.execute(httppost);
            HttpEntity entity = httpResponse.getEntity();

            InputStream inputStream = entity.getContent();

           //EntityUtils.toString(httpResponse.getEntity());
            String strres = convertStreamToString(inputStream);

            if (!strres.toString().trim().equals("0")) {
                Toast.makeText(Signin.this, "Successfully logged in ",
                        Toast.LENGTH_SHORT).show();
                Intent intent = new Intent(Signin.this, NewMainList.class);

                startActivity(intent);
            }

            else if (strres.toString().trim().equals("0")) {
                Toast.makeText(Signin.this, "Invalid login and password",
                        Toast.LENGTH_SHORT).show();
            }
            System.out.println("Response = " + strres);

           //username.setText("");
           //password.setText("");// clear text box
        } catch (ClientProtocolException e) {
            System.out.println(e);
        } catch (IOException e) {
            System.out.println(e);
        }
    }

    public String convertStreamToString(InputStream inputStream)
            throws IOException {
        if (inputStream != null) {
            StringBuilder sb = new StringBuilder();
            String line;
            try {
                BufferedReader reader = new BufferedReader(
                        new InputStreamReader(inputStream, "UTF-8"));
                while ((line = reader.readLine()) != null) {
                    sb.append(line).append("\n");
                }
            } finally {
                inputStream.close();
            }
            return sb.toString();
        } else {
            return "";
        }

    }

    public class GetAccess extends AsyncTask {
        ProgressDialog dialog;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            dialog = new ProgressDialog(Signin.this);
            dialog.setTitle("Please wait");
            dialog.setMessage("Getting login access");
            dialog.show();
        }

        @Override
        protected String doInBackground(String... params) {
            getLogin();
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            dialog.dismiss();
            setSession();
            loadList();

           //System.out.println(result);

        }

        private void setSession() {
            SharedPreferences preferences = getSharedPreferences("CurrentUser",
                    MODE_WORLD_READABLE);
            SharedPreferences.Editor editor = preferences.edit();
            editor.putString("Save", edt_mail.getText().toString());
            editor.putString("Save1", edt_password.getText().toString());
            editor.putString("Save2", strres.toString().trim());
            System.out.println("Response = " + strres);

            editor.commit();
            edt_mail.setText("");
            edt_password.setText("");

        }
    }

}

Примечание: эта кодовая работа, прекрасная в эмуляторе андроида 2.3 и устройствах. но когда я управляю этим кодом в андроиде 4.0 или выше. это дает мне, вызывают ошибку при закрытии. пожалуйста, помогите выйти из this.in logcat, он показывает android.os. Ошибка NetworkOnMainThreadException.. как я могу устранить эту проблему..???

1
nl ja de
почему u комментируют новый GetAccess() .execute (""); линия?
добавлено автор ρяσѕρєя K, источник

4 ответы

Ваша ошибка объясняется...

В более старых версиях AndroidOS вы смогли управлять организацией сети на нити UI, которая, если рассчитано, заставит ваше приложение прекращать отвечать. Чтобы решить это, более новые версии Android больше suppoer бегущая сеть не просят на нити UI, теперь необходимо сделать это в Нитях или AsyncTasks.

Эта линия: HttpResponse httpResponse = httpclient.execute (httppost); должен быть в нити, которая не управляет UI.

new Thread(){
    public void run(){
        //TODO Run network requests here.
        getLogin();
    }
}.start();

Почему это происходит... Android управляет чем-то, что может рецензироваться к как WatchDog, который в терминах laymans, часть кода, который связывает ваш код с Android. Этот таймер будет время от времени общаться с вашим приложением и OS, чтобы удостовериться, что все бежит правильно и что ничто не потерпело крах. Если вы будете управлять сетевым запросом на Нити UI, которая является той же самой нитью, которая управляет таймером WatchDog, и ваше время отклика, это запрет ваше целое приложение, заставляя его прекратить общаться с Android.

3
добавлено
Я не видел, что, поскольку добрался до вашего onClickListener для btn_login, и вы называете getLogin() без AsyncTask. Я использую Нити вместо Async во всем моем коде, таким образом, я могу быть mis чтение кода, где точно вы призываете AsyncTask?
добавлено автор Matt Clark, источник
я уже использую asynctask чувака. просто смотрите мой код правильно.
добавлено автор Riser, источник
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

            StrictMode.setThreadPolicy(policy);


add this lines after setcontentview(R.layout.main);
1
добавлено

У вас не может быть сетевого соединения на вашей Главной Нити. Это означает, что необходимо переместить его в другую Нить через Нить или AsyncTask.

Это означает, что необходимо сделать это к getLogin() метод. Не законно назвать любой обработка сетевого соединения в главной Нити.

1
добавлено

Попробуйте это,

Я изменился. удаленный Тост в doInBackground() добавляют добавленный в onPostExecute() .

  public class Signin extends Activity {

EditText edt_mail, edt_password;
Button btn_login, btn_pass, btn_reg, btn_forget;
ImageView iv1, iv2;
String strmail, strpassword, strres;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.signin);

    btn_forget = (Button) findViewById(R.id.btnforget);

    edt_mail = (EditText) findViewById(R.id.edt_Username);
    edt_password = (EditText) findViewById(R.id.edt_Password);

    btn_login = (Button) findViewById(R.id.btnlogin);
    btn_pass = (Button) findViewById(R.id.btncancel);
    btn_reg = (Button) findViewById(R.id.btnReg);
    iv1 = (ImageView) findViewById(R.id.imgfacebook);
    iv2 = (ImageView) findViewById(R.id.imgtwitter);
    btn_forget.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
           //TODO Auto-generated method stub
            Intent intent = new Intent(MainActivity.this,
                    ForgetPassword.class);
            startActivity(intent);

        }
    });
    iv2.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
           //TODO Auto-generated method stub
            Intent intent = new Intent(MainActivity.this, Twitter.class);
            startActivity(intent);

        }
    });
    iv1.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
           //TODO Auto-generated method stub
            Intent intent = new Intent(MainActivity.this, Facebook.class);
            startActivity(intent);

        }
    });

    btn_reg.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
           //TODO Auto-generated method stub
            Intent intent = new Intent(MainActivity.this, Signup.class);
            startActivity(intent);
        }
    });
    btn_pass.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {//TODO Auto-generated method stub

            cleartext();
        }

        public void cleartext() {//TODO Auto-generated method stub

            edt_mail.setText("");
            edt_password.setText("");
        }
    });

    btn_login.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
           //TODO Auto-generated method stub
            if (!edt_mail.getText().toString().equals("")) {

                if (!edt_password.getText().toString().equals("")) {

                    try {
                        if (CheckConnection()) {
                            new GetAccess().execute();
                           //getLogin();
                        } else {
                            Toast.makeText(
                                    MainActivity.this,
                                    "Please check your internet connection",
                                    Toast.LENGTH_LONG).show();
                        }

                    } catch (Exception e) {
                        Toast.makeText(MainActivity.this,
                                "Error caught = " + e.toString(),
                                Toast.LENGTH_LONG).show();
                    }

                } else {

                    Toast.makeText(MainActivity.this,
                            "please enter Password", Toast.LENGTH_LONG)
                            .show();
                }
            } else {
                Toast.makeText(MainActivity.this, "please enter Username",
                        Toast.LENGTH_LONG).show();

            }

        }

        private boolean CheckConnection() {
            final ConnectivityManager conMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            final NetworkInfo activeNetwork = conMgr.getActiveNetworkInfo();
            if (activeNetwork != null
                    && activeNetwork.getState() == NetworkInfo.State.CONNECTED) {
               //notify user you are online
               //System.out.println("Internet connected = 1");
                return true;

            } else {
               //notify user you are not online
               //System.out.println("Internet not connected = 0");
                Toast.makeText(getApplicationContext(),
                        "Please check your internet connection ",
                        Toast.LENGTH_SHORT).show();
                return false;

            }
        }
    });

}

public boolean CheckConnection() {
    final ConnectivityManager conMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    final NetworkInfo activeNetwork = conMgr.getActiveNetworkInfo();
    if (activeNetwork != null
            && activeNetwork.getState() == NetworkInfo.State.CONNECTED) {
       //notify user you are online
       //System.out.println("Internet connected = 1");
        return true;
    } else {
       //notify user you are not online
        System.out.println("Internet not connected = 0");
        Toast.makeText(getApplicationContext(),
                "Please check your internet connection ",
                Toast.LENGTH_SHORT).show();
        return false;

    }

}

private void loadList() {

    /*
     * ArrayAdapter adapter = new ArrayAdapter(
     * MainActivity.this, android.R.layout.simple_list_item_1, eventlist);
     * view.setAdapter(adapter);
     */

    Intent intent = new Intent(MainActivity.this, MainList.class);
    startActivity(intent);

}

public void getLogin() {

    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("my link");
    try {
        List nameValuePairs = new ArrayList(2);
       //nameValuePairs.add(new BasicNameValuePair("id", "12345"));
        nameValuePairs.add(new BasicNameValuePair("email", edt_mail
                .getText().toString().trim()));
        nameValuePairs.add(new BasicNameValuePair("password", edt_password
                .getText().toString().trim()));

        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        HttpResponse httpResponse = httpclient.execute(httppost);
        HttpEntity entity = httpResponse.getEntity();

        InputStream inputStream = entity.getContent();

       //EntityUtils.toString(httpResponse.getEntity());
        strres = convertStreamToString(inputStream);

        System.out.println("Response = " + strres);

       //username.setText("");
       //password.setText("");// clear text box
    } catch (ClientProtocolException e) {
        System.out.println(e);
    } catch (IOException e) {
        System.out.println(e);
    }
}

public String convertStreamToString(InputStream inputStream)
        throws IOException {
    if (inputStream != null) {
        StringBuilder sb = new StringBuilder();
        String line;
        try {
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(inputStream, "UTF-8"));
            while ((line = reader.readLine()) != null) {
                sb.append(line).append("\n");
            }
        } finally {
            inputStream.close();
        }
        return sb.toString();
    } else {
        return "";
    }

}

public class GetAccess extends AsyncTask {
    ProgressDialog dialog;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        dialog = new ProgressDialog(MainActivity.this);
        dialog.setTitle("Please wait");
        dialog.setMessage("Getting login access");
        dialog.show();
    }

    @Override
    protected String doInBackground(String... params) {
        getLogin();
        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        if (dialog.isShowing())
            dialog.dismiss();
        setSession();
        loadList();
        if (!strres.toString().trim().equals("0")) {
            Toast.makeText(MainActivity.this, "Successfully logged in ",
                    Toast.LENGTH_SHORT).show();
            Intent intent = new Intent(MainActivity.this, NewMainList.class);

            startActivity(intent);
        }

        else if (strres.toString().trim().equals("0")) {
            Toast.makeText(MainActivity.this, "Invalid login and password",
                    Toast.LENGTH_SHORT).show();
        }

       //System.out.println(result);

    }

    private void setSession() {
        SharedPreferences preferences = getSharedPreferences("CurrentUser",
                MODE_WORLD_READABLE);
        SharedPreferences.Editor editor = preferences.edit();
        editor.putString("Save", edt_mail.getText().toString());
        editor.putString("Save1", edt_password.getText().toString());
        editor.putString("Save2", strres.toString().trim());
        System.out.println("Response = " + strres);

        editor.commit();
        edt_mail.setText("");
        edt_password.setText("");

    }
}

}
0
добавлено
не работа.. но я получил свое решение..
добавлено автор Riser, источник
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

Android Developers
Android Developers
4 476 участник(ов)

Общаемся на темы, посвященным Android-разработке, SDK, Kotlin, Realm и т.д.

Android Architecture
Android Architecture
2 186 участник(ов)

Русскоязычный чат по архитектуре в андроид приложениях. Подробнее: http://telegra.ph/Android-Architecture-12-24

rus-speaking/android
rus-speaking/android
1 705 участник(ов)

Основной чат по Android разработке (вопрос-ответ). ПРАВИЛА: bit.ly/andr-rules. NEWS: bit.ly/AnrdResId ЧАТЫ: Основной: bit.ly/andr-main IDE, сборка, Git, сервисы: bit.ly/andr-tools Оффтоп: bit.ly/andr-offtop Конференции, события: bit.ly/andr-events Вакансии, найм: bit.ly/andr-job Архитектура: bit.ly/andr-patterns Rx: bit.ly/andr-rx Тестирование: bit.ly/andr-test Kotlin: bit.ly/andr-kotlin Хаmarin: bit.ly/andr-xamarin За мат, спам, агрессию, предложения о работе, оффтоп в этом канале - бан на сутки и более ☢☢☢

Android Dev Подкаст
Android Dev Подкаст
1 325 участник(ов)

Комната для обсуждения Android Dev подкаста apptractor.ru/AndroidDev/ Общее обсуждение Android: https://t.me/android_ru Остальные чаты про Android: http://t.me/devChats Наши новости https://t.me/androiddevpodcast_news

Android Guards
Android Guards
602 участник(ов)

Обсуждение любых вопросов касающихся безопасности Android. - Защита системы и приложений - Уязвимости и эксплойты - Вредоносное ПО - Копание в кишках системы и приложений (RE)

Android JOB
Android JOB
466 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению Android (full-time, part-time, remote и разовые подработки)

AndroidDev :: Разработка. It's Android time now!
AndroidDev :: Разработка. It's Android time now!
458 участник(ов)

It's Android time now! Чат разработчиков Android. Вакансии, резюме и информацию о митапах размещать можно. Публикацию скрытой и явной рекламы ваших каналов и сайтов после получения разрешения от @olegushakov

IDE и редакторы — русскоговорящее сообщество
IDE и редакторы — русскоговорящее сообщество
393 участник(ов)

Общаемся, сравниваем и помогаем друг другу решать задачи с продуктами JetBrains, VS Code, Atom, vim, Emacs, Sublime и т.д. Всё в одном месте, ведь каждый из них хорош по своему. См. также: @js_ru, @typescript_ru, @react_js, @nodejs_ru, @javascript_jobs

Aandroid Talks!
Aandroid Talks!
212 участник(ов)

Чат об общих вопросах по ОС Android. Чат для разработки под андроид - pro.android: https://t.me/joinchat/AAAAAEKIFKnmRT9cMebb9w

Android Rus
Android Rus
68 участник(ов)