当前位置: 首页 > 面试题库 >

Volley没有在最新版本的Android上发出请求

舒仲渊
2023-03-14
问题内容

我注意到我的应用程序无法在Pixel 3上运行。我进入android studio并模拟了一些设备,发现它在任何Android Pie(API
28)设备上均不工作,但在其他任何设备上均能正常工作。我在代码中放了一些日志,看来我在Volley使用中没有得到响应。该应用程序本身已加载,但未显示任何数据,并且收到错误消息

E / RecyclerView:未连接适配器;跳过布局

我的代码是

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.support.v7.app.AppCompatActivity;
import android.view.WindowManager;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONArray;
import org.json.JSONObject;

public class MainActivity extends AppCompatActivity {
    DatabaseManagement db;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_main);
        db = new DatabaseManagement(this);
        grabData();
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent i = new Intent(MainActivity.this, com.hellapunk.hellapunk.feature.Main2Activity.class);
                startActivity(i);
                finish();
            }
        }, 3000);
    }

    public void grabData() {
        //Log.i("Made it", "You made it this far");
        String url = "http://hellapunk.com/listallshows.php?id=2018";
        StringRequest sr = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                try {
                    JSONArray showInfo = new JSONArray(response);
                    Log.i("Something", "response");
                    for (int i = 0; i < showInfo.length(); ++i) {
                        JSONObject showInfo1 = showInfo.getJSONObject(i);

                        if ((db.checkShow(showInfo1.getString("show_summary"),
                                showInfo1.getString("show_date"))) > 0) {
                            Log.i("Results", "Show already exists");
                        } else {
                            db.insertShows(showInfo1.getString("show_summary"),
                                    showInfo1.getString("venue_name"),
                                    showInfo1.getString("show_date"),
                                    showInfo1.getString("shows_img"),
                                    showInfo1.getString("venue_address"),
                                    showInfo1.getString("city_name"),
                                    showInfo1.getString("city_region"));
                        }
                    }
                } catch (Exception e) {
                    Log.i("Error", e.getMessage());
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.i("TAG", ""+error);
            }
        });
        Volley.newRequestQueue(this).add(sr);

    }
}

我在启动画面中获取数据并将其存储到本地数据库中。然后在下一个活动中从数据库中调用它。任何建议将被认真考虑!


问题答案:

这是因为从Android P开始,您的应用程序和不安全的目标之间的所有网络流量都必须明确列入白名单。请参阅Android
P中默认情况下使用TLS保护用户

在您的代码中,您正在请求以下内容:

http://hellapunk.com/listallshows.php?id=2018

http://显示,该网站是不安全的。如果您更深入地研究LogCat,您可能会发现一条消息,例如:

com.android.volley.NoConnectionError: java.io.IOException: Cleartext HTTP traffic to hellapunk.com not permitted
    at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:177)
    at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:120)
    at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:87)
 Caused by: java.io.IOException: Cleartext HTTP traffic to hellapunk.com not permitted
    at com.android.okhttp.HttpHandler$CleartextURLFilter.checkURLPermitted(HttpHandler.java:115)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:458)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:407)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:538)
    at com.android.volley.toolbox.HurlStack.executeRequest(HurlStack.java:99)
    at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:131)
    at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:120) 
    at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:87)

我自己尝试过,该站点似乎不支持https连接,因此为了从您的应用程序访问此特定服务器,您需要hellapunk.com手动将该域列入白名单。

在您的资源目录中,为您的网络安全配置定义一个XML文档(例如res/xml/network_security_config.xml):

network_security_config.xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">hellapunk.com</domain>
    </domain-config>
</network-security-config>

然后,在您AndroidManifest.xml的应用程序的<application>标记中,添加属性:

<application
    android:networkSecurityConfig="@xml/network_security_config"

然后应允许您向该文件中指定的任何域提出不安全的请求。



 类似资料:
  • 我的应用程序需要确定设备是否具有谷歌提供的最新操作系统软件。 例如,目前,我需要能够确定设备是否正在运行Marshmallow,而不管手机可能永远无法安装Marshmallow的事实。 这是否需要硬编码到应用程序中? 谢啦

  • 虽然我有一个更新的android studio,我得到以下错误,但我不能找到Gradle4.1在gradle文件夹,但当我检查文件->项目结构->gradle插件是4。 我的建筑档案是这个。我设置为23,因为我需要在5.0.1手机上运行它。

  • 昨天,我将我的android studio 3.0.1更新为3.1,我正在尝试创建nexus 5的AVD [nexus 5图片 [我创建的AVD图像未显示playstore符号]2

  • 在maven 3.5.2中,如果依赖项的版本设置为发布或最新,则会显示以下警告: [警告]'依赖项。附属国。“版本” 如果pom的父版本设置为例如,则不会发出此警告: 这是故意的吗,这样我们就可以安全地继续依赖父pom的发布版本? 我们的用例是,我们为大约100个租户托管一个服务,这些租户需要一组公共配置文件和一些依赖关系管理等。这种公共配置在我们的“基本”pom中定义,每个租户的pom将其用作父

  • 目前,我正在使用mrecestQueue.cancelAll(getActive())在一个片段中的on Stop方法,但显然,当我将手机从横向移动到纵向时,它仍然返回请求中的数据,但会导致崩溃,因为持有人数据泄露已经存在了。有什么如何正确处理的示例代码吗?

  • 问题内容: 我想在其他线程中使用Android Volley库发出请求。 我的意思是,线程中存在连接,UI线程中处理了数据。 我要这样做是因为我有很多连接,要处理的数据很多,现在用户界面被阻止了。 那么,如何在不同的线程中创建和启动连接,然后在UIThread中执行OnResponse()/ OnErrorResponse()? 问题答案: Volley执行的每个网络请求都在后台线程中执行。凌空在