我注意到我的应用程序没有在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);
}
}
我在启动画面中抓取数据并将其存储到本地数据库中。然后在下一个Activity上从db调用它。任何建议将被认真考虑!
这是因为从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"
然后,您应该被允许对该文件中指定的任何域发出不安全的请求。
在Pie Api工作很好28
network_security_config.xml:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>
AndroidManifest.xml中
在应用程序标记中放置这些行
android:networkSecurityConfig="@xml/network_security_config"
android:usesCleartextTraffic="true"
对于这个问题,我使用https,它现在工作得非常好