当前位置: 首页 > 知识库问答 >
问题:

网络请求返回null-Android

洪昊然
2023-03-14

我正在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)让所有应用程序连接到网络:设置

但!什么也没发生...

这是我的类似问题链接,但在这个主题中没有答案:无法仅在我的Android应用程序中连接到互联网。连接internet的每个方法都返回null

网络正在我的手机上工作,因为一些应用程序,如电报和铬工作良好!

这里有一件有趣的事情,当我将此代码复制并传递到简单的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());
        }

    }
}

结果是: 错误: 空

共有1个答案

马峻
2023-03-14

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;
            }
        }
    }
}

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

 类似资料:
  • 我是SNMP新手,我正在尝试使用SNMP操作,我正在使用http://techdive.in/snmp/snmp4j-snmp-get-example代码,但我无法获得预期的输出。我得到如下空响应: SNMP获取演示正在向代理发送请求。。。从代理Snmp获取响应获取响应=[1.3.6.1.2.1.1.1.0=Null] 当我试图为MIB RFC 1213的OID获取sysDescr时,预期的输出应

  • 我正在使用React Native开发一个简单的应用程序。我正在Genymotion Android Emulator上测试它。我已经创建了本地web服务器来侦听请求,它正在运行http://localhost:8082/API/.我已经测试了api,工作正常。然后,我从索引中发出一个获取请求。Androidjs。 以下是来自React本机代码的API示例请求: 以下是Api服务器的代码(使用fl

  • Mpx提供了网络请求库fetch,抹平了微信,阿里等平台请求参数及响应数据的差异;同时支持请求拦截器,请求取消等 使用说明 import mpx from '@mpxjs/core' import mpxFetch from '@mpxjs/fetch' mpx.use(mpxFetch) // 第一种访问形式 mpx.xfetch.fetch({ url: 'http://xxx.com' }

  • 问题内容: 和存在一种奇怪的行为,json_encode而json_decode我找不到解决方案: 我的php应用程序调用了php Web服务。Web服务返回的json如下所示: 现在我想在应用程序中解码json: 但它返回NULL: 我使用php5。来自Web服务的响应的也尝试使用 可能是什么原因? 问题答案: 编辑: 只是做了一些快速检查由OP提供的字符串。大括号前面的小“字符”是。我不知道为

  • 问题内容: 和存在一种奇怪的行为,而我找不到解决方案: 我的php应用程序调用了php Web服务。Web服务返回的json如下所示: 现在我想在应用程序中解码json: 但它返回: 我使用php5。来自Web服务的响应的Content-Type :(也尝试使用) 可能是什么原因? 问题答案: 编辑: 只是做了一些快速检查由OP提供的字符串。大括号前面的小“字符”是UTF-8 B(yte)O(rd

  • 类似于Ajax,QAP实现了Fetch功能,能够简单的异步的获取资源。 GET QN.fetch('http://121.42.141.44:8888', { body: '', method: 'GET', mode: 'same-origin', dataType: 'text', }) .then(response => { return respon