Android: HttpUrlConnection возвращает пустой вывод - PullRequest
0 голосов
/ 26 сентября 2018

Итак, я пытаюсь прочитать поток с URL-адреса и установить результат в текстовом представлении.Проблема заключается в том, что код Android Studio не возвращает никакого результата на моем устройстве, в то время как тот же код на сетевых компонентах возвращает вывод потока.Я не понимаю, в чем проблема, потому что я использую тот же код, который использовался в Android Studio и Netbeans.Als Приложение на Android Studio не вылетает и не выдает никаких ошибок.

Просто чтобы позволить вамзнаю, что я открыл URL, который находится в коде Android Studio в браузере моего телефона, и он работает.Также я добавил интернет-разрешение в манифест.И я поместил функцию changeText в атрибут «onClick».

Следующий код был протестирован на NetBeans и Android Studio (на моей galaxy S6).

Код Android Studio:

       package com.example.mohammed.acc;

    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.TextView;

    import java.io.BufferedInputStream;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;

    public class MainActivity extends AppCompatActivity {

        public void changeText (View v){
            TextView t1 = (TextView)findViewById(R.id.t1);
            URL url;
            HttpURLConnection con;

            try{
                StringBuilder sb = new StringBuilder();
                url = new URL("http://192.168.1.104:8000/api");
                con = (HttpURLConnection) url.openConnection();
                BufferedInputStream in = new BufferedInputStream(con.getInputStream());
                BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                String Line = "";

                while((Line = reader.readLine()) != null){
                    sb.append(Line);
                }

                t1.append(sb.toString());
                in.close();




}
        catch (MalformedURLException ex) {
           t1.setText(ex.getMessage());
        }
        catch (IOException ex){
            t1.setText(ex.getMessage());
        } catch (Exception ex){
            t1.setText(ex.getMessage());
        }
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }
}

Код NetBeans:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication21;


import java.io.BufferedInputStream;
import java.util.Stack;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;


public class JavaApplication21 {


    public static void main(String[] args) {
         try{
            StringBuilder sb = new StringBuilder();
            URL url = new URL("http://127.0.0.1:8000/api");
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            BufferedInputStream in = new BufferedInputStream(con.getInputStream());
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            String Line = "";

            while((Line = reader.readLine()) != null){
                sb.append(Line);
            }
            System.out.print(sb.toString());
            in.close();
        }
        catch (Exception ex){
            System.out.print(ex.getMessage());
        }

    }

}

Вывод NetBeans: работает, как вы можете видеть.Netbeans output Студия Android, вывод моего телефона: enter image description here Регистрация снимков Это после запуска и нажатия кнопки.enter image description here

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

я вижу 2 проблемы:

1: ваш http io не выполняется в рабочем потоке;

2: не запрашивал разрешения во время выполнения (ваш уровень API может быть выше22);

import android.annotation.TargetApi;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import com.example.root.myapplication.R;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class MainActivity extends AppCompatActivity {


    @TargetApi(23)
    protected void askPermissions() {
        String[] permissions = {
                "android.permission.INTERNET"
        };
        int requestCode = 200;
        requestPermissions(permissions, requestCode);
    }

    public void changeText (View v){

        final TextView t1 = (TextView)findViewById(R.id.t1);

        new AsyncTask<Void,Void,Void>(){
            private Exception exception;
            private StringBuilder sb;
            @Override
            protected Void doInBackground(Void... voids) {
                try{
                    sb = new StringBuilder();
                    URL url;
                    HttpURLConnection con;
                    url= new URL("http://peyvandha.ir");
                    con= (HttpURLConnection) url.openConnection();
                    BufferedInputStream in = new BufferedInputStream(con.getInputStream());
                    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                    String Line = "";
                    while((Line = reader.readLine()) != null){
                        sb.append(Line);
                    }
                    in.close();
                }catch (Exception ex){
                    this.exception=ex;
                }
                return null;
            }

            @Override
            protected void onPostExecute(Void aVoid) {
                if(sb!=null){
                    //do what you do;
                    t1.setText(sb.toString());
                }else {
                    t1.setText(exception.getMessage());
                }
                super.onPostExecute(aVoid);
            }
        }.execute();

    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if(Build.VERSION.SDK_INT>22)askPermissions();

    }
}
0 голосов
/ 26 сентября 2018

Ваш код должен вызывать исключение NetworkOnMainThreadException, если он вызывается (вы не можете выполнить сетевой вызов в главном потоке).Так что, скорее всего, он вообще не вызывается, и ваш код обработки кнопок не работает.

На самом деле, я вижу, вы ловите Exception.Так что да, это вызовет исключение NetworkOnMainThreadException, и вы его перехватываете и игнорируете.Что даже базовый шаг в отладчике или чтение журналов скажет вам, если вам надоело печатать исключения для журнала.Если вы не печатаете исключения где-то, не удивляйтесь, если вы не увидите ошибок, но ничего не происходит.

Также - не ошибка, но запуск findViewById в обработчике событий считается плохой практикой.Они должны быть запущены один раз в onCreate и результат кэшируется.

...