Java 陷入了从android中的另一个类获取arraylist的困境
我正在制作一个项目,其中我通过api获取数据并将其存储在arraylist中,但当我返回它时,它是空的。Java 陷入了从android中的另一个类获取arraylist的困境,java,android,android-volley,Java,Android,Android Volley,我正在制作一个项目,其中我通过api获取数据并将其存储在arraylist中,但当我返回它时,它是空的。 有人能帮我吗 这里是主要活动 package com.example.trivia; import androidx.appcompat.app.AppCompatActivity; import androidx.cardview.widget.CardView; import android.os.Bundle; import android.util.Log; import and
有人能帮我吗 这里是主要活动
package com.example.trivia;
import androidx.appcompat.app.AppCompatActivity;
import androidx.cardview.widget.CardView;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import com.example.trivia.Data.Async;
import com.example.trivia.Data.setQ;
import com.example.trivia.controller.AppController;
import com.example.trivia.model.question;
import org.json.JSONArray;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private CardView c;
private Button t_btn,f_btn;
private ImageButton next,prev;
private List<question>q;
private TextView set;
private int count=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
c=findViewById(R.id.cardView);
t_btn=findViewById(R.id.true_btn);
f_btn=findViewById(R.id.false_btn);
next=findViewById(R.id.next);
prev=findViewById(R.id.prev);
set=findViewById(R.id.setq);
//ArrayList<question> dummy = new ArrayList<question>();
//AppController.OnCreate();
q=new setQ().getData(new Async() {
@Override
public void finish(ArrayList<question> c) {
set.setText(c.get(count).getQ());
// Log.d("test", "onCreate: "+c);
}
});
Log.i("in main", "Main: "+q.size());
}
}
package com.example.trivia;
导入androidx.appcompat.app.appcompat活动;
导入androidx.cardwiew.widget.cardwiew;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.view;
导入android.widget.Button;
导入android.widget.ImageButton;
导入android.widget.TextView;
导入com.example.trivia.Data.Async;
导入com.example.trivia.Data.setQ;
导入com.example.trivia.controller.AppController;
导入com.example.trivia.model.question;
导入org.json.JSONArray;
导入java.util.ArrayList;
导入java.util.List;
公共类MainActivity扩展了AppCompatActivity{
私人卡迪维c;
专用按钮t_btn,f_btn;
私有图像按钮下一步,上一步;
私人Listq;
私有文本视图集;
私有整数计数=0;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
c=findViewById(R.id.cardView);
t_btn=findviewbyd(R.id.true_btn);
f_btn=findviewbyd(R.id.false_btn);
next=findViewById(R.id.next);
prev=findViewById(R.id.prev);
set=findviewbyd(R.id.setq);
//ArrayList dummy=新的ArrayList();
//AppController.OnCreate();
q=new setQ().getData(new Async()){
@凌驾
公共空隙饰面(ArrayList c){
set.setText(c.get(count.getQ());
//Log.d(“test”,“onCreate:+c”);
}
});
Log.i(“in main”,“main:+q.size());
}
}
setQ类的代码
package com.example.trivia.Data;
import android.util.Log;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.example.trivia.controller.AppController;
import com.example.trivia.model.question;
import org.json.JSONArray;
import org.json.JSONException;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
public class setQ {
ArrayList<question> q =new ArrayList<question>();
JSONArray r;
private String url="https://raw.githubusercontent.com/curiousily/simple-quiz/master/script/statements-data.json";
public List<question> getData(final Async call) {
final JsonArrayRequest jarr = new JsonArrayRequest(Request.Method.GET, url, (JSONArray)null, new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
r=response;
for (int i = 0; i < response.length(); i++) {
try {
JSONArray a = response.getJSONArray(i);
question k = new question(a.getString(0), a.getBoolean(1));
//Log.i("list", "onResponse: "+k.getAns());
q.add(k);
// Log.i("response", "onResponse: " +a.get(0));
} catch (JSONException e) {
e.printStackTrace();
}
}
if(call!=null) {
call.finish( q);
}
//return q;
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
Log.i("error ",""+AppController.getInstance());
AppController.getInstance().addToRequestQueue(jarr);
return q;
// return q;
}
}
package com.example.trivia.Data;
导入android.util.Log;
导入com.android.volley.Request;
导入com.android.volley.Response;
导入com.android.volley.VolleyError;
导入com.android.volley.toolbox.JsonArrayRequest;
导入com.example.trivia.controller.AppController;
导入com.example.trivia.model.question;
导入org.json.JSONArray;
导入org.json.JSONException;
导入java.lang.reflect.Array;
导入java.util.ArrayList;
导入java.util.List;
公共类setQ{
ArrayList q=新的ArrayList();
杰索纳雷;
专用字符串url=”https://raw.githubusercontent.com/curiousily/simple-quiz/master/script/statements-data.json";
公共列表getData(最终异步调用){
final JsonArrayRequest jarr=new JsonArrayRequest(Request.Method.GET,url,(JSONArray)null,new Response.Listener(){
@凌驾
公共void onResponse(JSONArray响应){
r=响应;
对于(int i=0;i
输出
07/11 23:55:18: Launching 'app' on Pixel 3 API 21.
$ adb shell am start -n "com.example.trivia/com.example.trivia.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
Connected to process 15594 on device 'emulator-5554'.
Capturing and displaying logcat messages from application. This behavior can be disabled in the "Logcat output" section of the "Debugger" settings page.
W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter androidx.vectordrawable.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
I/art: Rejecting re-init on previously-failed class java.lang.Class<androidx.core.view.ViewCompat$2>
Rejecting re-init on previously-failed class java.lang.Class<androidx.core.view.ViewCompat$2>
I/error: com.example.trivia.controller.AppController@24777a64
***I/in main: Main: 0***
D/OpenGLRenderer: Render dirty regions requested: true
D/: HostConnection::get() New Host Connection established 0x7f28894105c0, tid 15594
D/Atlas: Validating map...
I/art: Background sticky concurrent mark sweep GC freed 5802(428KB) AllocSpace objects, 0(0B) LOS objects, 0% free, 2MB/2MB, paused 8.789ms total 42.738ms
D/: HostConnection::get() New Host Connection established 0x7f28950b0e40, tid 15624
I/OpenGLRenderer: Initialized EGL, version 1.4
W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
D/EGL_emulation: eglCreateContext: 0x7f2894773200: maj 3 min 1 rcv 4
D/EGL_emulation: eglMakeCurrent: 0x7f2894773200: ver 3 1 (tinfo 0x7f289470fe40)
E/eglCodecCommon: glUtilsParamSize: unknow param 0x000082da
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00008cdf
glUtilsParamSize: unknow param 0x00008824
D/OpenGLRenderer: Enabling debug mode 0
D/EGL_emulation: eglMakeCurrent: 0x7f2894773200: ver 3 1 (tinfo 0x7f289470fe40)
I/Choreographer: Skipped 62 frames! The application may be doing too much work on its main thread.
07/11 23:55:18:在Pixel 3 API 21上启动“应用程序”。
$adb shell am start-n“com.example.trivia/com.example.trivia.MainActivity”-一个android.intent.action.MAIN-c android.intent.category.LAUNCHER
已连接到设备“emulator-5554”上的进程15594。
从应用程序捕获和显示logcat消息。可以在“调试器”设置页面的“Logcat输出”部分禁用此行为。
W/art:Android 4.1之前的方法Android.graphics.PorterDuffColorFilter androidx.vectordrawable.graphics.drawable.VectorDrawableCompat.UpdatentFilter(Android.graphics.PorterDuffColorFilter,Android.content.res.ColorStateList,Android.graphics.PorterDuff$模式)将错误地重写android.graphics.drawable.drawable中的包私有方法
I/art:拒绝在以前失败的类java.lang.class上重新初始化
拒绝在以前失败的类java.lang.class上重新初始化
I/错误:com.example.trivia.controller。AppController@24777a64
***输入/输入主设备:主设备:0***
D/OpenGLRenderer:请求渲染脏区域:true
D/:HostConnection::get()已建立新主机连接0x7f28894105c0,tid 15594
地图集:正在验证地图。。。
I/art:背景粘性并发标记扫描GC释放5802(428KB)AllocSpace对象,0(0B)LOS对象,0%空闲,2MB/2MB,暂停8.789ms总计42.738ms
D/:HostConnection::get()已建立新主机连接0x7f28950b0e40,tid 15624
I/OpenGLRenderer:初始化EGL,版本1.4
W/OpenGLRenderer:未能选择保留EGL\u交换\u行为的配置,正在重试,但没有。。。
D/EGL_仿真:eglCreateContext:0x7f2894773200:maj 3 min 1 rcv 4
D/EGL_仿真:eglMakeCurrent:0x7f2894773200:ver 3 1(tinfo 0x7f289470fe40)
E/eglCodecCommon:glUtilsParamSize:未知参数0x000082da
E/eglCodecCommon:glUtilsParamSize:未知参数0x00008cdf
glUtilsParamSize:未知参数0x00008824
D/OpenGLRenderer:启用调试模式0
D/EGL_仿真:eglMakeCurrent:0x7f2894773200:ver 3 1(tinfo 0x7f289470fe40)
我/编舞:跳过了62帧!应用程序可能在其主线程上做了太多工作。
实现回调模式
创建新的接口文件:
Interface MyVolleyResponse {
void onResponse(JSONArray response);
void onError(VolleyError error);
}
您的活动应实现这一点,如下所示:
public class MainActivity extends AppCompatActivity implements MyVolleyResponse {...}
将新方法添加到活动中:
void onResponse(JSONArray response) {
// process your response here, building your question array...
}
void onError(VolleyError error) {
// handle errors here...
}
换衣服
public void onResponse(JSONArray response) {
callback.onResponse(response);
}
public void onErrorResponse(VolleyError error) {
callback.onError(error);
}
private MyVolleyResponse callback;
SetQ(MyVolleyResponse callback) {
this.callback = callback;
}
SetQ volley = new SetQ(this);
void getData() {...}