@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
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы