gpt4 book ai didi

java - 如果我从另一个类获得 AsyncTask 类的结果,则不会显示 ProgressDialog

转载 作者:行者123 更新时间:2023-11-29 05:31:32 25 4
gpt4 key购买 nike

如果我像这样从另一个 AsynkTask 类中获取结果:

注册.java:

public void onClick(View v) {
LoadFermate backgroundFermate = new LoadFermate(Register.this);
ArrayList<HashMap<String, String>> fermate;
try{
fermate = backgroundFermate.execute().get();
for (HashMap<String, String> fermata:fermate){
Toast.makeText(Register.this , fermata.get("Nome"), Toast.LENGTH_SHORT).show();
}
}catch (InterruptedException e){
e.printStackTrace();
}catch (ExecutionException e){
e.printStackTrace();
}
}

未显示 ProgressDialog。相反,如果我在 onPostExecute 方法中执行所有这些操作,则会显示出来。这怎么可能?

我学习了从that question中的其他类获取值的方法.

在这里我发布了我使用 ProgressDialog 的类:

加载Fermate.java:

package com.PacchettoPrincipale.app;

import [...]

public class LoadFermate extends AsyncTask<Void, Void, ArrayList<HashMap<String, String>>> {

private Context context;

public LoadFermate(Context context){
this.context = context;
}

private ProgressDialog pDialog;

private JSONArray mComments = null;
private ArrayList<HashMap<String, String>> mCommentList;

//testing on Emulator:
private static final String DOWNLOAD_FERMATE_URL = "http://10.0.2.2/PrimaAppAndroid/fermate.php";



//JSON IDS:
private static final String TAG_COD = "CodFermata";
private static final String TAG_POSTS = "posts";
private static final String TAG_NOME = "Nome";

@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(context); //HERE I START THE PDIALOG, and in the onPostExecute method I dismiss it
pDialog.setMessage("Download fermate...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}

@Override
protected ArrayList<HashMap<String, String>> doInBackground(Void... voids) {
updateJSONData();
return mCommentList;
}

@Override
protected void onPostExecute(ArrayList<HashMap<String, String>> hashMaps) {
super.onPostExecute(hashMaps);

pDialog.dismiss();
}

private void updateJSONData() {

mCommentList = new ArrayList<HashMap<String, String>>();

JSONParser jParser = new JSONParser();
JSONObject json = jParser.getJSONFromUrl(DOWNLOAD_FERMATE_URL);

try {

mComments = json.getJSONArray(TAG_POSTS);

for (int i = 0; i < mComments.length(); i++) {
JSONObject c = mComments.getJSONObject(i);

int CodFermata = c.getInt(TAG_COD);
String Nome = c.getString(TAG_NOME);


HashMap<String, String> map = new HashMap<String, String>();

map.put(TAG_COD, String.valueOf(CodFermata));
map.put(TAG_NOME, Nome);

mCommentList.add(map);

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

最佳答案

这是因为您的应用程序的 UI 线程在您等待任务完成时被阻塞。您的程序在这一行被阻止:

ermate = backgroundFermate.execute().get();

文档说“get():如有必要,等待计算完成,然后检索其结果。” (您可以在这里阅读:http://developer.android.com/reference/android/os/AsyncTask.html#get())

在 Android 中,UI 元素(例如进度对话框)不能由多线程操作。 (这意味着你不能调用它们的任何方法,否则你将以异常结束。)它们只能由创建它们的线程操作。此线程是您的应用程序的主线程(或 UI 线程,换句话说)。

但我们需要在单独的线程上工作,并且仍然想更新 UI!

这个问题可以通过多种方式解决。通过使用 Handlers 和 Runnables,但这有时可能很复杂。AsyncTask 的概念是代替你来做这个工作。 OnPreExecute() 在 UI 线程上执行,然后在单独的线程上执行任务,onPostExecute() 也在主线程上执行。

如果你知道这一点,我很抱歉。回到你的问题:因为您通过在 AsyncTask 上调用 get() 来阻塞 UI 线程,所以 onPreExecute() 和 onPostExecute() 不能在 UI 线程上运行!它们被发布到主线程,但只有在主线程完成它正在做的事情后它们才会运行。也就是说,在 get() 返回之后。然后将显示一个对话框并立即关闭,这就是您看不到它的原因。

不要这样等待结果。在 onPostExecute() 中处理结果,因为它是为此目的而设计的。

关于java - 如果我从另一个类获得 AsyncTask 类的结果,则不会显示 ProgressDialog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20924758/

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