Почему httpurlconnection не выполняется?

Я отправляю данные на php-сервер с android. Но httpurlconnection не работает. Я думаю, что с моим URL-адресом не происходит соединение. Я не могу отладить свой код, поскольку я тестирую свою сборку apk на своем мобильном телефоне, потому что мой компьютер не поддерживает моделирование. Я проверяю тост во время его выполнения, но после подключения он не показывает тоста CONNECTED или NOT CONNECTED. Что-то не так с моим кодом подключения URL-адреса или мне нужно что-то сделать на стороне моего php-сервера, чтобы принять соединение из приложения Android?

package com.it.jumtech.equestion;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import android.app.AlertDialog;
import android.widget.Toast;

public class LoginActivity extends AppCompatActivity {

Button button_login;
EditText edit_uid,edit_pwd;
AlertDialog.Builder builder;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    button_login = (Button)findViewById(R.id.button_login);
    edit_uid = (EditText)findViewById(R.id.edit_uid);
    edit_pwd = (EditText)findViewById(R.id.edit_pwd);
    builder = new AlertDialog.Builder(this);
    // onclick button this function will execute
    button_login.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try {
                JSONObject jsonObject = new JSONObject();
                jsonObject.put("uid", edit_uid.getText().toString());
                jsonObject.put("pwd", edit_pwd.getText().toString());
                String logininfo = jsonObject.toString();
                Toast.makeText(LoginActivity.this,
                        "Json Built = " + logininfo, Toast.LENGTH_LONG).show();
                String link = "http://www.example.com/login_chk.php";
                URL url = new URL(link);
                HttpURLConnection conn = null;
                conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod("POST");
                conn.setDoOutput(true);
                conn.setDoInput(true);
                if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
                    Toast.makeText(LoginActivity.this,
                            "Connected", Toast.LENGTH_LONG).show();
                }else{
                    Toast.makeText(LoginActivity.this,
                            "Not Connected", Toast.LENGTH_LONG).show();
                }
                OutputStream os = conn.getOutputStream();
                Toast.makeText(LoginActivity.this,
                        "ostream made", Toast.LENGTH_LONG).show();
                BufferedWriter bw = new BufferedWriter(new
                        OutputStreamWriter(os,"UTF-8"));
                String data  = URLEncoder.encode("param_logininfo", "UTF-8") + " = " +
                        URLEncoder.encode(logininfo, "UTF-8");
                bw.write(data);
                Toast.makeText(LoginActivity.this,
                        data+"written to url", Toast.LENGTH_LONG).show();
                bw.flush();
                bw.close();
                os.close();
                Toast.makeText(LoginActivity.this,
                        "Json Sent", Toast.LENGTH_LONG).show();
                int respcode = conn.getResponseCode();
                Toast.makeText(LoginActivity.this,
                        "Response code = "+respcode, Toast.LENGTH_LONG).show();
                InputStream is = conn.getInputStream();
                BufferedReader br = new BufferedReader(new
                        InputStreamReader(is,"UTF-8"));
                StringBuffer sb = new StringBuffer();
                String line = null;
                // read server output
                Toast.makeText(LoginActivity.this,
                        "Read from server", Toast.LENGTH_LONG).show();
                while((line = br.readLine()) != null) {
                    sb.append(line);
                }
                br.close();
                String result = sb.toString();
                Toast.makeText(LoginActivity.this,
                        "Success return from server", Toast.LENGTH_LONG).show();
                Toast.makeText(LoginActivity.this,
                        result, Toast.LENGTH_LONG).show();
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

}
}

Вы не можете выполнять сетевые операции в основном потоке.

Henry 07.01.2019 09:26

@ Генри, что ты только что сказал? объяснять.

user3099225 07.01.2019 09:37

Android не позволяет создавать сети в потоке пользовательского интерфейса (основном), поскольку это потенциально может заблокировать пользовательский интерфейс. Вам нужно сделать это в отдельном потоке. См. Также stackoverflow.com/questions/6343166/…

Henry 07.01.2019 09:54
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
3
741
1

Ответы 1

Вам необходимо добавить специальное разрешение, чтобы иметь возможность отправлять HTTP-запросы. Android по умолчанию блокирует простой HTTP, потому что он считается небезопасным.

Ваш манифест должен содержать:

<manifest ...>
    <uses-permission android:name = "android.permission.INTERNET" />
    <application
        ...
        android:usesCleartextTraffic = "true"
        ...>
        ...
    </application>
</manifest>

Если у вас не настроено это разрешение, Android выдает IOException.

Кроме того, похоже, что вы выполняете сеть в основном потоке, что не допускается.

Используйте рабочий поток или AsyncTask для блокировки операций, таких как HTTP-запрос.

Интернет-разрешение есть. хорошо, я попробую асинхронную задачу.

user3099225 07.01.2019 09:39

вы можете помочь мне с кодом? несколько примеров кода, которые показывают, как написать соединение в асинхронной задаче.

user3099225 07.01.2019 11:01

@ user3099225 посмотрите здесь: medium.com/@lewisjkl/…

Daniel B. 07.01.2019 11:02

Другие вопросы по теме