带有 ResponseListener 的 AsyncTask

Posted

技术标签:

【中文标题】带有 ResponseListener 的 AsyncTask【英文标题】:AsyncTask with ResponseListener 【发布时间】:2020-07-18 04:08:15 【问题描述】:

我想从 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 获得的所有信息(并在请求结束时执行此操作;))。

我是安卓编程的新手。提前感谢您的帮助;)

【问题讨论】:

你怎么知道 postexecute 在 doinbackground 之前执行?设置适配器可以在oncreate中,把它放在post上有什么意义?期待什么? 【参考方案1】:

问题是onPostExecutedoInBackground之前执行。

RequestQueue in Volley 通过网络线程异步操作。因此,onPostExecutedoInBackgroundplantsListRequest 的响应之前被调用。

如果你想在网络调用时阻塞线程(任务),你可以使用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;

凌空抽射

参考

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

【讨论】:

以上是关于带有 ResponseListener 的 AsyncTask的主要内容,如果未能解决你的问题,请参考以下文章

返回带有列的表[重复]

PHP Php - DÃasy mesesenespañol

SearchBar 在单击取消按钮之前不显示结果

我应该在 Fragment 中的啥生命周期状态下执行异步任务?

用vba把excel文件发布转化为pdf格式文件

Laravel 查询生成器`SELECT (x IN (?)) AS y`