Java 陷入了从android中的另一个类获取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

我正在制作一个项目,其中我通过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 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() {...}