Как получить возвращаемое значение AsyncTask в android studio - PullRequest
0 голосов
/ 17 июня 2020

Привет, я знаю, что об этом написано много, но ЕГО ТАК запутывает Я много их читал, но мне не удается решить простую проблему. Все, что я хочу, это получить класс из my main activity.kt, когда я сделаю

val QuizzList = Network().execute(); (в main activity.kt)

Я хочу, чтобы QuizzList был мой класс, а не asyn c задача blabla.

Что мне нужно здесь сделать, чтобы эта задача вернула QuizCollection (это настраиваемый класс)?


package com.example.myapplication;

import android.os.AsyncTask;
import android.os.Build;

import androidx.annotation.RequiresApi;

import com.google.gson.Gson;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class Network extends AsyncTask<String, Integer, Object> {

    static InputStream is = null;

    static JSONObject jObj = null;
    static String json = "";

    // constructor
    public Network() {

    }
    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    @Override
    protected QuizCollection doInBackground(String... params) {

        try {
            // On doit utiliser cet adresse URL, le 127.0.0.1 ne marche pas a cause du serveur qui
            // Roule deja sur l'adresse.

            //Get the content from the server
            URL url = new URL("http://10.0.2.2:8080/api/quizz");
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setRequestProperty("Content-Type", "application/json");
            con.setRequestMethod("GET");
            BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
            String inputLine;
            StringBuffer content = new StringBuffer();
            while ((inputLine = in.readLine()) != null) {
                content.append(inputLine);
            }
            Gson gson = new Gson();
            JSONArray jsonArray = new JSONArray(content.toString());
            System.out.println("Le content : "+content.toString());




            QuizCollection quizz = new QuizCollection();
            for (int i=0; i<jsonArray.length();i++){
                System.out.println(jsonArray.get(0).toString());
                Quiz quiz = gson.fromJson(jsonArray.getJSONObject(i).toString(), Quiz.class);
                System.out.println("Titre "+quiz.Title);
                quizz.addQuiz(quiz);
            }


            System.out.println("ca fonctionne?"+quizz.QuizArray.get(0).Title);

            in.close();
            return quizz;
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }
    protected void onPostExecute(Object page)
    {
        //onPostExecute
    }

}



Ответы [ 2 ]

0 голосов
/ 17 июня 2020

Мне пришлось это сделать

protected void onPostExecute(QuizCollection result)
{
    //onPostExecute
    super.onPostExecute(result);
}

И сделать .get () после вызова execute

0 голосов
/ 17 июня 2020

Вы должны использовать обратный вызов

public interface OnTaskCompleted{
    void onTaskCompleted(QuizCollection  collection);
}

В своей деятельности:

//do whatever you want with collection which is the object returned from AsyncTask
Network(OnTaskCompleted { collection -> collection.toString() }).execute()

И ваша AsyncTask:

public class YourTask extends AsyncTask<Object,Object,QuizCollection >{ 

    private OnTaskCompleted listener;

    public YourTask(OnTaskCompleted listener){
        this.listener=listener;
    }

    // required methods

    protected QuizCollection doInBackground(String... params) {
          return new QuizCollection();
    }


    protected void onPostExecute(QuizCollection collection){
        // your stuff
        listener.onTaskCompleted(collection);
    }
}
...