卡在从另一个类从android获取arraylist [英] stuck in getting arraylist from another class in android

查看:102
本文介绍了卡在从另一个类从android获取arraylist的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在制作一个项目,该项目中我通过api获取数据并将其存储在arraylist中,但是当我返回它时,它是空的.
有人可以帮我吗?

I’m making a project in which i get data through api and stored it in arraylist but when i return it, it is empty.
Can Anyone Help Me Out?

这是主要活动

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

}

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

输出

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.

推荐答案

实施回调模式.

创建一个新的接口文件:

Create a new Interface file:

Interface MyVolleyResponse {
    void onResponse(JSONArray response);
    void onError(VolleyError error);
}

您的活动应实现此目标,如下所示:

Your activity should implement this, as follows:

public class MainActivity extends AppCompatActivity implements MyVolleyResponse {...}

将新方法添加到您的活动中:

Add the new methods to your activity:

void onResponse(JSONArray response) {
    // process your response here, building your question array...
}

void onError(VolleyError error) {
    // handle errors here...
}

SetQ内更改您的Volley响应:

Change your Volley responses within SetQ:

public void onResponse(JSONArray response) {
    callback.onResponse(response);
}

public void onErrorResponse(VolleyError error) {
    callback.onError(error);
}

SetQ中创建一个构造函数以设置回调:

Create a constructor within SetQ to set the callback:

private MyVolleyResponse callback;

SetQ(MyVolleyResponse callback) {
    this.callback = callback;
}

在您的活动中通过以下方式调用此构造函数:

Call this constructor in your activity with:

SetQ volley = new SetQ(this);

getData的签名更改为:

void getData() {...}

并使用volley.getData()运行Volley调用.

删除代码中的所有AsyncTask对象,因为Volley已经是异步的.

Remove all AsyncTask objects in your code, because Volley is already asynchronous.

这篇关于卡在从另一个类从android获取arraylist的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆