【问题标题】:Android: HttpUrlConnection returning empty outputAndroid:HttpUrlConnection 返回空输出
【发布时间】:2018-09-26 19:18:51
【问题描述】:

所以我正在尝试从 URL 读取流并将结果设置在文本视图中。 问题是代码 Android Studio 没有在我的设备上返回任何结果,而 net beans 上的相同代码返回流输出。我不明白问题出在哪里,因为我使用的是在 Android Studio 和 Netbeans 中使用的相同代码。Als android studio 上的应用程序没有崩溃或抛出任何错误。

只是为了让您知道我已经在手机浏览器中打开了 android studio 代码中的 URL 并且它正在工作。我还在清单中添加了互联网权限。而且我确实将函数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 输出: 如您所见,它正在工作。 Android studio,我手机的输出: 记录快照 这是在运行并单击按钮之后。

【问题讨论】:

  • @JeelVankhede 这应该是一个按钮点击处理程序。所以不,他没有。
  • 我提到我确实调用了该函数。
  • 我也使用相同的函数将 textView 更改为“Hello World”并且它工作正常。
  • t1.append(sb.toString()) 你的意思是 setText() 在 while 循环之后的 try 块中吗?
  • 它是 t1.setText()。但是在这里发布代码之前我忘了改回来。

标签: java android android-studio netbeans httpurlconnection


【解决方案1】:

如果您的代码被调用,它应该会导致 NetworkOnMainThreadException(您不能在主线程上进行网络调用)。所以很可能它根本没有被调用,并且您的按钮处理代码已损坏。

实际上,我看到您正在捕获异常。所以是的,它会抛出一个 NetworkOnMainThreadException,而你正在捕捉并忽略它。如果您费心将异常打印到日志中,即使是在调试器中进行基本单步执行或阅读日志也会告诉您。如果您没有在某处打印异常,如果您没有看到任何错误但没有发生任何事情,请不要感到惊讶。

也不是错误,但在事件处理程序中运行 findViewById 被认为是一种不好的做法。这些应该在 onCreate 中运行一次并缓存结果。

【讨论】:

  • 这不是你提到的异常。
  • @Mick2160 然后它没有被调用。您编写的该功能将不起作用。要么网络失败,要么写入文本视图失败,因为一个不能在主线程上完成,另一个必须在主线程上完成。并且点击处理程序在主线程上运行。
  • 我现在该怎么办? @Gabe Sechan
【解决方案2】:

我发现了 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();

    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-09
    • 2020-10-13
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 2022-01-23
    相关资源
    最近更新 更多