застрял в получении arraylist из другого класса в android - PullRequest
0 голосов
/ 11 июля 2020

Я делаю проект, в котором я получаю данные через 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());
   }

}

код класса 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.

1 Ответ

0 голосов
/ 12 июля 2020

Реализуйте шаблон обратного вызова.

Создайте новый файл интерфейса:

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

Измените свои ответы Volley в SetQ:

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

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

Создайте конструктор в SetQ, чтобы установить обратный вызов:

private MyVolleyResponse callback;

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

Вызовите этот конструктор в своей деятельности с помощью:

SetQ volley = new SetQ(this);

Измените подпись getData на просто:

void getData() {...}

И запустите вызов Volley с volley.getData() .

Удалите все AsyncTask объекты в вашем коде, потому что Volley уже является асинхронным.

...