【问题标题】:Network Requests return null - Android网络请求返回 null - Android
【发布时间】:2015-08-31 16:55:50
【问题描述】:

我正在使用 android 进行网络通信项目,但我的应用程序无法正常工作!经过一些调试,我发现每个网络请求都有来自系统的空响应。

我尝试了很多方法,例如: 1)硬重启我的手机 2) 将所有网络权限添加到清单文件中

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>

3) 使用本地网络(我的手机作为服务器) 4)让所有应用程序连接到网络:设置>联网应用程序> ...

但是!什么都没发生……

这是我的类似问题链接,但是这个话题没有答案: can't connect to internet in ONLY in my android app. Each method to connect internet returns null

网络正在我的手机上运行,​​因为电报和 Chrome 等一些应用运行良好!

这里有一件有趣的事情,当我将此代码复制并粘贴到简单的 java 项目而不是 android 项目时,它运行良好!

因为我想找出问题出在哪里,所以我只是将简单的 3 行代码复制到简单的 android 项目中,但仍然没有任何反应!

清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.dltests"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="11"
        android:targetSdkVersion="17" />

    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <TextView
        android:id="@+id/hello"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</RelativeLayout>

源文件

package com.example.dltests;

import java.net.HttpURLConnection;
import java.net.URL;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {

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

        TextView mTextView = (TextView) findViewById(R.id.hello);

        try 
        {
            URL mUrl = new URL("http://192.168.1.53:8080/some.zip");
            HttpURLConnection mHttpURLConnection = (HttpURLConnection) mUrl.openConnection();
            mTextView.setText(mHttpURLConnection.getContentLength());

        } 
        catch (Exception e) 
        {
            mTextView.setText("ERROR: " + e.getMessage());
        }

    }
}

结果是: 错误:空

【问题讨论】:

  • 记录异常看NetworkOnMainThreadException,然后想想异常名称是什么意思。
  • 您确定您的手机可以访问该网址吗?如果您使用手机的网络浏览器访问192.168.1.53:8080/HiSuiteSetup_2.3.55.1.zip,会发生什么?
  • @laalto:没错!这就是错误:android.os.NetworkOnMainThreadException
  • @elevine : 打开下载应用程序
  • @laalto 是在正确的轨道上。您需要在不同的线程上进行下载。

标签: java android networking null httpurlconnection


【解决方案1】:

Android 禁止您在 UI 线程中联网。你需要做的是产生一个单独的线程来为你做网络。然后,您需要接收器或处理程序来使用数据发布/更新 UI。

1 - 创建一个新类:

import android.os.Handler;
import android.os.Message;

public class GetData extends Thread
{

    // Holds url that data is stored on
    private URL url

    // Sets the url value
    public GetData(URL newUrl)
    {
         url = newUrl;
    }

    // Runs when the thread is launched
    public void run()
    {
        // Opens connection
        HttpURLConnection con = (HttpURLConnection) url.openConnection();

        // Sends back to UI using a Message
        Message msg = MainActivity.MainActivityInterface.obtainMessage(MainActivity.getAndUpdate);
        msg.obj = con.getContentLength(); // Adds the data
        HomeScreen.homeScreenInterface.sendMessage(msg); 
    }
}

2 - 在活动中创建处理程序,以便可以更新 UI 以及启动工作线程

import java.net.HttpURLConnection;
import java.net.URL;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

import android.os.Handler;
import android.os.Message;

public class MainActivity extends Activity {

    // Holds activity instance
    public static MainActivity currentInstance;

    // Variable that allows us to separate messages for handler
    public static final getAndUpdate = 0;

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

        currentInstance = this;
        TextView mTextView = (TextView) findViewById(R.id.hello);

        try 
        {
            URL mUrl = new URL("http://192.168.1.53:8080/some.zip");

            // Spawns worker thread
            GetData gd = new GetData(mUrl);
            gd.start();
        } 
        catch (Exception e) 
        {
            mTextView.setText("ERROR: " + e.getMessage());
        }
    }

    // Deals with service responses
    public static Handler MainActivityInterface = new Handler()
    {
        @Override
        public void handleMessage(Message msg)
        {
            switch(msg.what)
            {
                case getAndUpdate:
                    currentInstance.mTextView.setText((String) msg.obj); // Gets message object and updates UI
                break;
            }
        }
    }
}

我希望这会有所帮助。请注意,我没有测试它,因为我离我的编码计算机很远!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 2019-08-26
    • 2017-03-12
    • 2016-03-31
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多