@kiddle

Как сделать http запрос в andoird?

Здравствуйте, я пытаюсь авторизоваться пост-запросом в форме json. Но в logcat пишет, что нельзя в главном потоке делать запросы. Как разграничить потоки или есть способ сделать это в одном потоке?
package com.example.xiaomi.TrackMove;

import android.content.DialogInterface;
import android.content.Intent;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;

import javax.net.ssl.HttpsURLConnection;

public class MainActivity extends AppCompatActivity {

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

        Button loginButton = (Button) findViewById(R.id.LoginButton);
        loginButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Login();
            }
        });
    }

    public void Login() {
        EditText loginText = (EditText) findViewById(R.id.LOGIN);
        EditText passText = (EditText) findViewById(R.id.PASS);
        TextView textView = (TextView) findViewById(R.id.OUT);

        textView.setText("WORK!");
        try {
            JSONObject json = new JSONObject();
            json.put("username", loginText.getText().toString());
            json.put("password", passText.getText().toString());
            json.put("apikey", 1);


            URL url = new URL(link);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setDoOutput(true);
            con.setDoInput(true);
            con.setRequestMethod("POST");
            con.setRequestProperty("Content-Type", "application/json");
            con.setUseCaches(false);

            OutputStream out = new BufferedOutputStream(con.getOutputStream());
            out.write(json.toString().getBytes());
            out.flush();
            out.close();

            StringBuilder sb = new StringBuilder();
            if (con.getResponseCode() == HttpURLConnection.HTTP_OK) {
                textView.setText("WORK!");
                InputStream is = con.getInputStream();
                BufferedReader br = new BufferedReader(
                        new InputStreamReader(is, "utf-8"));
                String line = "";
                while ((line = br.readLine()) != null)
                    sb.append(line + "\n");
                br.close();
                textView.setText(sb);
                Intent intent = new Intent(this, TasksActivity.class);
                startActivity(intent);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • Вопрос задан
  • 282 просмотра
Пригласить эксперта
Ответы на вопрос 3
@MyOnAsSalat
В главном потоке (ui -отвечающий за работу интерфеса) запрос сделать нельзя выведет ошибку (гугл запретил чтобы приложения не зависали). Изпользуйте асинхронный поток для запроса.
Ответ написан
Комментировать
@mr_serg77
В асинктаск запихните.

А вообще используйте OkHttp + Retrofit.
Ответ написан
@Dmtm
Android
асинктаск не предназначен для запросов, где-то даже в документации об этом упоминалось,
потому что асинктаск живет до первого поворота экрана,
используйте Thread
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы