java - Volley 未在最新版本的 Android 上发出请求

标签 java android android-volley android-9.0-pie

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

E/RecyclerView: No adapter attached; skipping layout

我的代码是

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

    }
}

我在启动画面期间抓取数据并将其存储到本地数据库中。然后在下一个 Activity 中从数据库调用它。任何建议将不胜感激!

最佳答案

这是因为从 Android P 开始,您的应用与不安全目的地之间的任何网络流量都必须明确列入白名单。参见 Protecting users with TLS by default in Android P .

在您的代码中,您请求:

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"

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

关于java - Volley 未在最新版本的 Android 上发出请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54176034/

相关文章:

java - 当我运行项目时,在 Eclipse 中对类的更改没有反射(reflect)出来

java - 如何使用 FFmpeg 并排合并长度超过 2 分钟的视频

android - 如何使用 HttpURLConnection 而不是 Volley 获取 JSON 对象?

java - 如何使用 JDOM 编写和获取同一级别中具有相同名称的所有 xml 元素

java - (i >>> -distance) 是如何工作的

java - Android Slider 中的 NoClassDefFoundError 错误

android - 如何在不使用 ADB 的情况下在 Android 中自动化 Android 单元测试

java - "new"Java(Android) 中的关键字 :D

android - 使用 Volley 进行异步帐户身份验证

android - 在 Android 库 AAR 中使用时无法找到 Volley 的字节码