gpt4 book ai didi

java - 带有 ResponseListener 的 AsyncTask

转载 作者:行者123 更新时间:2023-12-01 17:35:10 25 4
gpt4 key购买 nike

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

这是我调用执行的 fragment :

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 编程新手。预先感谢您的帮助;)

最佳答案

The problem is that the onPostExecute is executed before the doInBackground.

Volley 中的

RequestQueue 通过网络线程异步操作。因此,在 doInBackground 中的 plantsListRequest 响应之前调用 onPostExecute

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

引用

关于java - 带有 ResponseListener 的 AsyncTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61055076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com