У меня проблема с HttpUrlConnection - PullRequest
0 голосов
/ 05 декабря 2018

, пожалуйста, помогите с этой проблемой, с которой я сталкиваюсь:

Я пытаюсь вызвать метод из класса, который подключится к службе php.Он не содержит ошибок, но когда я его запускаю, он закрывается с сообщением извините, приложение было остановлено .

это основное действие:

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;

import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

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

    public void hhtp(View view) throws Exception {
        result="";
        JavaHttpUrlConnectionReader con = new JavaHttpUrlConnectionReader();
        result = con.doHttpUrlConnectionAction("http://example.com/app.php");
        Toast.makeText(getApplicationContext(),"Button is clicked"+result,Toast.LENGTH_LONG).show();
    }
}

это класс:

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.net.HttpURLConnection;

import java.net.URL;

public class JavaHttpUrlConnectionReader {

    public static void main(String[] args)
            throws Exception
    {
        new JavaHttpUrlConnectionReader();
    }
   public String doHttpUrlConnectionAction(String desiredUrl)
            throws Exception
    {
        URL url = null;
        BufferedReader reader = null;
        StringBuilder stringBuilder;

        try
        {
            // create the HttpURLConnection
            url = new URL(desiredUrl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

            // just want to do an HTTP GET here
            connection.setRequestMethod("GET");

            // uncomment this if you want to write output to this url
            //connection.setDoOutput(true);

            // give it 15 seconds to respond
            connection.setReadTimeout(15*1000);
            connection.connect();

            // read the output from the server
            reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            stringBuilder = new StringBuilder();

            String line = null;
            while ((line = reader.readLine()) != null)
            {
                stringBuilder.append(line + "\n");
            }
            return stringBuilder.toString();
        }
        catch (Exception e)
        {
            e.printStackTrace();
            throw e;
        }
        finally
        {
            // close the reader; this can throw an exception too, so
            // wrap it in another try/catch block.
            if (reader != null)
            {
                try
                {
                    reader.close();
                }
                catch (IOException ioe)
                {
                    ioe.printStackTrace();
                }
            }
        }
    }
}

это main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/http_url_request_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="hhtp"
        android:text="Checa si hay nueva Sol" />

</android.support.constraint.ConstraintLayout>

и, наконец, это веб-сервис в php:

<?php
$data=$_POST['dato'];
$rsp="1";
echo $rsp;
?>

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Вы испытываете исключение "Сеть в главном потоке"!Поздравляем, теперь вы являетесь разработчиком L2 для Android: D

Это обеспечивается ОС Android для того, чтобы убедиться, что приложения не реагируют на запросы, и чтобы разработчики выполняли асинхронную работу, ну ...асинхронно!

См. обоснование здесь -> https://developer.android.com/reference/android/os/NetworkOnMainThreadException

Здесь есть несколько способов решения проблемы - AsyncTasks, Runnables, Handlers, Java Futures, Kotlin Coroutines, Rx (приблизительнопорядок сложности).

Вот несколько похожих вопросов, на которые в прошлом был дан ответ на эту проблему:

Удачи, и пишите здесь, если не можете найти путь вперед!

0 голосов
/ 05 декабря 2018

Вы выполняете сетевой вызов в потоке пользовательского интерфейса, который выдал исключение.Попробуйте использовать класс AsyncTask и выполните сетевые подключения оттуда.

...