POST запрос в андроид

432
28 декабря 2016, 03:44

в gradle прописано:

android {
    compileSdkVersion 23
    buildToolsVersion "25.0.0"
    useLibrary 'org.apache.http.legacy'
dependencies {
    compile 'org.apache.httpcomponents:httpcore:4.4.5'

в манифесте:

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

Не могу получить данные.

HttpClient httpclient = new DefaultHttpClient();
            HttpPost http = new HttpPost(myURL);
            List nameValuePairs = new ArrayList(2);
            nameValuePairs.add(new BasicNameValuePair("login", loginMap.get(0)));
            nameValuePairs.add(new BasicNameValuePair("password", loginMap.get(1)));
            try {
                http.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            try {
                String response = (String) httpclient.execute(http, new BasicResponseHandler());
                System.out.println(response);
            } catch (IOException e) {
                e.printStackTrace();
            }

Вываливается ошибка:

12-26 12:31:49.114 13673-13673/com.lovelinux.root.tmaxim E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.lovelinux.root.tmaxim, PID: 13673
android.os.NetworkOnMainThreadException
   at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
   at java.net.InetAddress.lookupHostByName(InetAddress.java:418)
   at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
   at java.net.InetAddress.getAllByName(InetAddress.java:215)
   at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:142)
   at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:169)
   at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:124)
   at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:365)
   at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:560)
   at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:658)
   at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:632)
   at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:621)
   at com.lovelinux.root.tmaxim.MainActivity$1$override.onClick(MainActivity.java:94)
   at com.lovelinux.root.tmaxim.MainActivity$1$override.access$dispatch(MainActivity.java)
   at com.lovelinux.root.tmaxim.MainActivity$1.onClick(MainActivity.java:0)
   at android.view.View.performClick(View.java:4780)
   at android.view.View$PerformClick.run(View.java:19866)
   at android.os.Handler.handleCallback(Handler.java:739)
   at android.os.Handler.dispatchMessage(Handler.java:95)
   at android.os.Looper.loop(Looper.java:135)
   at android.app.ActivityThread.main(ActivityThread.java:5254)
   at java.lang.reflect.Method.invoke(Native Method)
   at java.lang.reflect.Method.invoke(Method.java:372)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
class httpQUERY extends AsyncTask<Void, Void, Void> {
    String myURL = "https://адрес";
    String params ;
    byte[] data = null;
    InputStream is = null;
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }
    @Override
    protected Void doInBackground(Void... paramss) {
        if (!loginMap.isEmpty()) {
            params = "login=" + loginMap.get(0) + "&password=" + loginMap.get(1);
        }else{
            System.out.println("Empty array");
            return null;
        }
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost http = new HttpPost(myURL);
        List nameValuePairs = new ArrayList(2);
        nameValuePairs.add(new BasicNameValuePair("login", loginMap.get(0)));
        nameValuePairs.add(new BasicNameValuePair("password", loginMap.get(1)));
        try {
            http.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        try {
            String response = (String) httpclient.execute(http, new BasicResponseHandler());
            System.out.println(response);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    @Override
    protected void onPostExecute(Void result) {//Выполняется после doInBackground
        super.onPostExecute(result);
        System.out.println("I am here");
    }
}
Answer 1

NetworkOnMainThreadException свидетельствует о том, что Вы пытаетесь обратиться к веб-ресурсу из UI-потока, чего делать нельзя.

Все запросы к интернету нужно осуществлять в потоках, отличных от UI-потока. В самом примитивном случае можно использовать AsyncTask, но, вообще говоря, лучше использовать библиотеки, которые из коробки могут выполнять запросы не в UI-потоке (OkHttp, RoboSpice и т.п.).

UPD: Если Вы получаете данное исключение и используете AsyncTask, то проверьте, не вызываете ли Вы напрямую метод doInBackground(...), если вызываете – замените строку вызова этого метода на task.execute(...), где task – экземпляр класса AsyncTask.

READ ALSO
как обработать ответ Retrofit

как обработать ответ Retrofit

Отправляю GET запрос и приходит в log такой ответ onResponse: comexample

440
Как реализовать подобный интерфейс

Как реализовать подобный интерфейс

Какими компонентами можно реализовать подобный интерфейс и какие свойства этих компонентов использовать? Прежде всего интересует реализация...

390
Как поставить like в Vk

Как поставить like в Vk

Вечер добрый, у меня стоит задача: надо поставить лайк под записью, пишу вот этот код:

398
при потключении к h2 в jar вылетает nullpointerexception

при потключении к h2 в jar вылетает nullpointerexception

Создаю десктоп приложение на джавеДля хранение данных решил использовать H2 бд

376