带有ResponseListener的AsyncTask

问题描述 投票:0回答:1

我想从JSON获取数据并在asyncTask中执行此操作。问题是onPostExecute在doInBackground之前执行。

所以这是我的片段,称为执行:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    new GetPlantsList().execute();


}

和我的AsyncTask

public class GetPlantsList extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected Void doInBackground(Void... voids) {
        Response.Listener<String> responseListener = new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                //Si pas d'erreur
                try {
                    // Here my JSON response

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        };

        //On récupére le fichier php via la variable dans strings.xml et on envoi la requete
        PlantsListRequest plantsListRequest = new PlantsListRequest(user_id, responseListener, getResources().getString(R.string.php_file) + "get_plants_list.php");
        RequestQueue queue = Volley.newRequestQueue(getActivity());
        queue.add(plantsListRequest);
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        // Initialisation de la recycler view (qui va comporter la liste des plantes)
        rv_plants = (RecyclerView) view_frag.findViewById(R.id.rv_list_plants);

        //On vient créer la liste des plantes avec la class Recycler view Plants List (on lui envoie toutes les plantes de mon utilisateurs)
        PlantsList plantsList = new PlantsList(getActivity(), tv_plants_name, tv_plants_variety, iv_plants_img, id_plants);

        //Mon recycler view vient afficher la liste des plantes
        rv_plants.setAdapter(plantsList);
        rv_plants.setLayoutManager(new LinearLayoutManager(getActivity()));
    }

}

在我的onPostExecute中,我只是尝试显示从JSON获得的所有信息(并在请求结束时进行;)。

我是android编程中的新手。预先感谢您的帮助;)

java android android-fragments asynchronous android-asynctask
1个回答
0
投票

问题是onPostExecutedoInBackground之前执行。

通过网络线程操作[[

[[异步]的[RequestQueue中的[Volley]。因此,在onPostExecute中的plantsListRequest响应之前调用doInBackground

如果要在网络通话时阻止线程(任务),则可以使用RequestFuture

但是不推荐。

您可以简单地通过NetworkQueueListener进行网络调用。 (没有AsyncTask)。使用RequestFuture@Override protected Void doInBackground(Void... voids) { RequestFuture<String> future = RequestFuture.newFuture(); //On récupére le fichier php via la variable dans strings.xml et on envoi la requete PlantsListRequest plantsListRequest = new PlantsListRequest(user_id, future, getResources().getString(R.string.php_file) + "get_plants_list.php"); RequestQueue queue = Volley.newRequestQueue(getActivity()); queue.add(plantsListRequest); String response = future.get(); // blocking thread return null; }

排球

volley - request

参考

https://developer.android.com/training/volley/simple

© www.soinside.com 2019 - 2024. All rights reserved.