【发布时间】:2021-09-08 19:23:53
【问题描述】:
我在这里使用 volley 通过我的 api 从 xampp 服务器获取数据(在邮递员上工作正常) 但是在运行代码时得到这个,一旦应用程序打开并且应用程序不会崩溃,就会显示定义 onErrorResponse 的 Toast。 阅读了很多解决方案,很多都与片段有关..我没有使用片段...... 同样在我的代码中,我认为当我在 recyclerview 上调用 setAdapter 方法时,我刚刚在它上面定义了 myAdapter
MyAdapter myAdapter = new MyAdapter(data);
recyclerView.setAdapter(myAdapter);
主要活动.java
package com.example.poetryapp;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.example.poetryapp.adapter.MyAdapter;
import com.example.poetryapp.model.PoetryModel;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.util.HashMap;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
RecyclerView recyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.poetry_recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
loaddata();
}
private void loaddata() {
String url = "http://192.168.137.198/poetryapi/getPoetryRead.php.php";
StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new com.android.volley.Response.Listener<String>() {
@Override
public void onResponse(String response) {
GsonBuilder gsonBuilder = new GsonBuilder();
Gson gson = gsonBuilder.create();
PoetryModel data[]=gson.fromJson(response,PoetryModel[].class);
MyAdapter myAdapter = new MyAdapter(data);
recyclerView.setAdapter(myAdapter);
myAdapter.notifyDataSetChanged();
Log.e("success",response);
}
}, new com.android.volley.Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getApplicationContext(),error.toString(),Toast.LENGTH_LONG).show();
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String,String> params=new HashMap<>();
return params;
}
};
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
}
}
MyAdapter.java
package com.example.poetryapp.adapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.poetryapp.R;
import com.example.poetryapp.model.PoetryModel;
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.viewHolder> {
PoetryModel data[];
public MyAdapter(PoetryModel[] data) {
this.data = data;
}
@NonNull
@Override
public viewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.poetry_list_view,parent,false);
return new viewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull viewHolder holder, int position) {
holder.t1_name.setText(data[position].getPoet_name());
holder.t2_data.setText(data[position].getPoetry_data());
holder.t3_date_time.setText(data[position].getDate_time());
}
@Override
public int getItemCount() {
return data.length;
}
class viewHolder extends RecyclerView.ViewHolder{
TextView t1_name,t2_data,t3_date_time;
public viewHolder(@NonNull View itemView) {
super(itemView);
t1_name=itemView.findViewById(R.id.tv_poetName);
t2_data=itemView.findViewById(R.id.tv_poetryData);
t3_date_time=itemView.findViewById(R.id.tv_poet_dateTime);
}
}
}
main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.appcompat.widget.Toolbar
android:id="@+id/main_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/black" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/main_toolbar"
android:orientation="vertical"
>
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/poetry_recyclerView"
/>
</LinearLayout>
</RelativeLayout>
logcat 错误信息
2021-09-09 09:38:45.963 29496-29496/com.example.poetryapp E/RecyclerView: No adapter attached; skipping layout
2021-09-09 09:38:46.004 29496-29496/com.example.poetryapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.poetryapp, PID: 29496
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
at com.google.gson.Gson.fromJson(Gson.java:944)
at com.google.gson.Gson.fromJson(Gson.java:897)
at com.google.gson.Gson.fromJson(Gson.java:846)
at com.google.gson.Gson.fromJson(Gson.java:817)
at com.example.poetryapp.MainActivity$1.onResponse(MainActivity.java:53)
at com.example.poetryapp.MainActivity$1.onResponse(MainActivity.java:46)
at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:82)
at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:29)
at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:102)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7868)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:981)
Caused by: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:349)
at com.google.gson.internal.bind.ArrayTypeAdapter.read(ArrayTypeAdapter.java:70)
at com.google.gson.Gson.fromJson(Gson.java:932)
at com.google.gson.Gson.fromJson(Gson.java:897)
at com.google.gson.Gson.fromJson(Gson.java:846)
at com.google.gson.Gson.fromJson(Gson.java:817)
at com.example.poetryapp.MainActivity$1.onResponse(MainActivity.java:53)
at com.example.poetryapp.MainActivity$1.onResponse(MainActivity.java:46)
at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:82)
at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:29)
at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:102)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7868)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:981)
我的网址返回这个
{
"status": "1",
"message": "record is not empty",
"data": [
{
"id": "1",
"poetry_data": "shdoqw djwaiood aand od sodnh asisd d ashd asidhas das das doaisdhas dsa d as diwdhw xs dw wh codfj e",
"poet_name": "abcd efg",
"date_time": "2021-09-02 08:32:10"
},
{
"id": "2",
"poetry_data": "updating this",
"poet_name": "abc",
"date_time": "2021-09-04 10:38:22"
},
{
"id": "4",
"poetry_data": "aaaaaaaaaaaa bbbbbbbbbbbbb cccccccccccccc",
"poet_name": "abc",
"date_time": "2021-09-02 10:11:08"
},
{
"id": "5",
"poetry_data": "aaaaaaaaaaaaaaaaaaaaa",
"poet_name": "aa",
"date_time": "2021-09-03 10:16:08"
},
{
"id": "6",
"poetry_data": "aaaaaaaaaaaaaaaaaaaaa",
"poet_name": "aa",
"date_time": "2021-09-03 10:16:22"
},
{
"id": "7",
"poetry_data": "aaaaaaaaaaaaaaaaaaaaa",
"poet_name": "aa",
"date_time": "2021-09-03 10:17:04"
},
{
"id": "8",
"poetry_data": "",
"poet_name": "",
"date_time": "2021-09-06 09:19:39"
},
{
"id": "9",
"poetry_data": "",
"poet_name": "",
"date_time": "2021-09-06 09:23:38"
},
{
"id": "10",
"poetry_data": "",
"poet_name": "",
"date_time": "2021-09-06 09:24:00"
},
{
"id": "11",
"poetry_data": "bhdjasvjguuuuuuuuuuuuuuuu",
"poet_name": "nameisname",
"date_time": "2021-09-06 09:29:59"
},
{
"id": "12",
"poetry_data": "bhdjasvjguuuuuuuuuuuuuuuu",
"poet_name": "abara",
"date_time": "2021-09-06 09:42:43"
},
{
"id": "13",
"poetry_data": "bhdjasvjguuuuuuuuuuuuuuuu",
"poet_name": "kkkkkkkhgvghytu",
"date_time": "2021-09-06 09:52:21"
}
]
}
第二个错误与 gson 有关,但我不知道如何正确编写它以将 json 解析为 gson 以获得我的 url 返回的结构。
谢谢!
【问题讨论】:
标签: java android android-studio android-recyclerview