在很多人的帮助下,我得到了这个代码:但我面临两个问题1 - 似乎线程睡眠只影响线程而不是正在进行的消息对话框,所以Tarea finalizada不能被看作出现并消失得如此之快。如果我设置了Tarea inicializada(开始任务)的消息,则无法显示...如果我放入背景它不显示,如果我把它放在&#34之后; Cargando数据支持espere" (加载数据,请稍候)它显示Tarea inicializada但不显示Cargando数据。我需要一些技巧来查看不同的消息...
理想情况是: - " Cargando数据显示espere" (两秒钟) - Tarea inicializada(两秒钟) - Tarea finalizada(两秒钟)。 - 解雇并返回主要活动
再次感谢
类ServicioInicial扩展了AsyncTask<空隙,空隙,空隙> { private Context mContext;
ProgressDialog mProgress;
private ServicioInicialFinalizado mCallback;
public ServicioInicial( Context context) {
this.mContext=context;
this.mCallback= ( ServicioInicialFinalizado) context;
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
mProgress= new ProgressDialog(mContext);
mProgress.setMessage("Cargando contactos...Por favor espere");
mProgress.show();
// mProgress.setMessage ("Tarea comenzada");
}
@Override
protected Void doInBackground(Void... resultado) {
try
{
//Aqui simulo un calculo supercomplicado y lo ralentizamos a 500 ms por numero
// mProgress.setMessage("Tarea comenzada");
//Reseteo la agendaGlobal
AgendaGlobal.getInstance().miAgenda.clear();
AgendaGlobal.getInstance().miAgenda.add(new contactoAgenda("Belen", "c/ Diego Madrazo","92458", "belen@gmail.com",true, true, false, false, true,"Familia", R.drawable.aguila));
AgendaGlobal.getInstance().miAgenda.add(new contactoAgenda("Daniel", "c/ Diego Madrazo","92458", "daniel@gmail.com",true, true, false, false, true,"Familia", R.drawable.caballo));
AgendaGlobal.getInstance().miAgenda.add(new contactoAgenda("Eduardo", "c/ Segovia","92458", "eduardo@gmail.com",true, true, false, false, true,"Familia", R.drawable.camaleon));
AgendaGlobal.getInstance().miAgenda.add(new contactoAgenda("Belen", "c/ Diego Madrazo","92458", "belen@gmail.com",true, true, false, false, true,"Familia", R.drawable.aguila));
AgendaGlobal.getInstance().miAgenda.add(new contactoAgenda("Daniel", "c/ Diego Madrazo","92458", "daniel@gmail.com",true, true, false, false, true,"Familia", R.drawable.caballo));
AgendaGlobal.getInstance().miAgenda.add(new contactoAgenda("Eduardo", "c/ Segovia","92458", "eduardo@gmail.com",true, true, false, false, true,"Familia", R.drawable.camaleon));
AgendaGlobal.getInstance().miAgenda.add(new contactoAgenda("Belen", "c/ Diego Madrazo","92458", "belen@gmail.com",true, true, false, false, true,"Familia", R.drawable.aguila));
AgendaGlobal.getInstance().miAgenda.add(new contactoAgenda("Daniel", "c/ Diego Madrazo","92458", "daniel@gmail.com",true, true, false, false, true,"Familia", R.drawable.caballo));
AgendaGlobal.getInstance().miAgenda.add(new contactoAgenda("Eduardo", "c/ Segovia","92458", "eduardo@gmail.com",true, true, false, false, true,"Familia", R.drawable.camaleon));
// resultado[] = (Integer)(Math.random()*(3))+1;// numero = (int) (Math.random() *6) + 1; para un dado
// mProgress.setMessage("Resultado Int:" + resultado);
// resultado = (Integer) resultado; // convierto a entero me aseguro
Thread.sleep(3000);
//mProgress.setMessage ("Tarea finalizada");
//SystemClock.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
// mProgress.setMessage ("Tarea finalizada");
return null;
}
@Override
protected void onCancelled(Void result) {
// TODO Auto-generated method stub
super.onCancelled(null);
}
@Override
protected void onPostExecute(Void result) {
mProgress.setMessage ("Tarea finalizada");
try {
Thread.sleep (3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mProgress.dismiss();
/*if(mProgress != null){
mProgress.dismiss();
}*/
//Aqui es donde devolvemos los datos a donde nos llama
mCallback.onAcabeInicializacion(5);
super.onPostExecute(null);
}
@Override
protected void onProgressUpdate(Void... values) {
// TODO Auto-generated method stub
//mProgress.setMessage( values[0]);
//super.onProgressUpdate(values);
}
}
答案 0 :(得分:1)
当您使用doInBackgroundMethod时,除了UI线程之外,您正在处理一个Thread,因此您无法从那里更新您的可视化界面。所以,在doInBackground上没有办法改变它。
相反,您可以使用OnPreExecute和OnPostExecute来处理您的进度。对于我认为你正在努力的事情,它将是:
private Context mContext;
ProgressDialog mProgress;
private ServicioInicialFinalizado mCallback;
public ServicioInicial( Context context) {
this.mContext=context;
this.mCallback= ( ServicioInicialFinalizado) context;
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
mProgress= new ProgressDialog(mContext);
mProgress.setMessage("Cargando contactos...Por favor espere");
mProgress.show();
mProgress.setMessage("Tarea comenzada");
}
@Override
protected Void doInBackground(Void... resultado) {
try
{
//Aqui simulo un calculo supercomplicado y lo ralentizamos a 500 ms por numero
AgendaGlobal.getInstance().miAgenda.add(new contactoAgenda("Belen", "c/ Diego Madrazo","92458", "belen@gmail.com",true, true, false, false, true,"Familia", R.drawable.aguila));
AgendaGlobal.getInstance().miAgenda.add(new contactoAgenda("Daniel", "c/ Diego Madrazo","92458", "daniel@gmail.com",true, true, false, false, true,"Familia", R.drawable.caballo));
AgendaGlobal.getInstance().miAgenda.add(new contactoAgenda("Eduardo", "c/ Segovia","92458", "eduardo@gmail.com",true, true, false, false, true,"Familia", R.drawable.camaleon));
AgendaGlobal.getInstance().miAgenda.add(new contactoAgenda("Belen", "c/ Diego Madrazo","92458", "belen@gmail.com",true, true, false, false, true,"Familia", R.drawable.aguila));
AgendaGlobal.getInstance().miAgenda.add(new contactoAgenda("Daniel", "c/ Diego Madrazo","92458", "daniel@gmail.com",true, true, false, false, true,"Familia", R.drawable.caballo));
AgendaGlobal.getInstance().miAgenda.add(new contactoAgenda("Eduardo", "c/ Segovia","92458", "eduardo@gmail.com",true, true, false, false, true,"Familia", R.drawable.camaleon));
AgendaGlobal.getInstance().miAgenda.add(new contactoAgenda("Belen", "c/ Diego Madrazo","92458", "belen@gmail.com",true, true, false, false, true,"Familia", R.drawable.aguila));
AgendaGlobal.getInstance().miAgenda.add(new contactoAgenda("Daniel", "c/ Diego Madrazo","92458", "daniel@gmail.com",true, true, false, false, true,"Familia", R.drawable.caballo));
AgendaGlobal.getInstance().miAgenda.add(new contactoAgenda("Eduardo", "c/ Segovia","92458", "eduardo@gmail.com",true, true, false, false, true,"Familia", R.drawable.camaleon));
// resultado[] = (Integer)(Math.random()*(3))+1;// numero = (int) (Math.random() *6) + 1; para un dado
// mProgress.setMessage("Resultado Int:" + resultado);
// resultado = (Integer) resultado; // convierto a entero me aseguro
Thread.sleep(200);
//mProgress.setMessage ("Tarea finalizada");
SystemClock.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
// mProgress.setMessage ("Tarea finalizada");
return null;
}
@Override
protected void onCancelled(Void result) {
// TODO Auto-generated method stub
super.onCancelled(null);
}
protected void onPostExecute() {
mProgress.setMessage ("Result Integer en postexecute:");
mProgress.setMessage ("Tarea terminada");
try {
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mProgress.dismiss();
//Aqui es donde devolvemos los datos a donde nos llama
mCallback.onAcabeInicializacion(5);
super.onPostExecute(null);
}
@Override
protected void onProgressUpdate(Void... values) {
// TODO Auto-generated method stub
// mProgress.setMessage( values[0]);
//super.onProgressUpdate(values);
}
如果你的mProgress没有在onPostExecute方法中更新,那是因为你的doInBackground没有完成它的工作,所以看看这一点,可能是你的睡眠者。
答案 1 :(得分:0)
您需要扩展AsyncTask <Void, String, Void>
并使用OnProgressUpdate
来更新消息。
在课堂上进行以下更改:
class ServicioInicial extends AsyncTask <Void, String, Void> {
private Context mContext;
ProgressDialog mProgress;
private ServicioInicialFinalizado mCallback;
public ServicioInicial( Context context) {
this.mContext=context;
this.mCallback= (ServicioInicialFinalizado) context;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
mProgress= new ProgressDialog(mContext);
mProgress.setMessage("Cargando contactos...Por favor espere");
mProgress.show();
}
@Override
protected Void doInBackground(Void... resultado) {
try
{
Thread.sleep(2000);
AgendaGlobal.getInstance().miAgenda.add(new contactoAgenda("Belen", "c/ Diego Madrazo","92458", "belen@gmail.com",true, true, false, false, true,"Familia", R.drawable.aguila));
AgendaGlobal.getInstance().miAgenda.add(new contactoAgenda("Daniel", "c/ Diego Madrazo","92458", "daniel@gmail.com",true, true, false, false, true,"Familia", R.drawable.caballo));
AgendaGlobal.getInstance().miAgenda.add(new contactoAgenda("Eduardo", "c/ Segovia","92458", "eduardo@gmail.com",true, true, false, false, true,"Familia", R.drawable.camaleon));
AgendaGlobal.getInstance().miAgenda.add(new contactoAgenda("Belen", "c/ Diego Madrazo","92458", "belen@gmail.com",true, true, false, false, true,"Familia", R.drawable.aguila));
AgendaGlobal.getInstance().miAgenda.add(new contactoAgenda("Daniel", "c/ Diego Madrazo","92458", "daniel@gmail.com",true, true, false, false, true,"Familia", R.drawable.caballo));
AgendaGlobal.getInstance().miAgenda.add(new contactoAgenda("Eduardo", "c/ Segovia","92458", "eduardo@gmail.com",true, true, false, false, true,"Familia", R.drawable.camaleon));
AgendaGlobal.getInstance().miAgenda.add(new contactoAgenda("Belen", "c/ Diego Madrazo","92458", "belen@gmail.com",true, true, false, false, true,"Familia", R.drawable.aguila));
AgendaGlobal.getInstance().miAgenda.add(new contactoAgenda("Daniel", "c/ Diego Madrazo","92458", "daniel@gmail.com",true, true, false, false, true,"Familia", R.drawable.caballo));
AgendaGlobal.getInstance().miAgenda.add(new contactoAgenda("Eduardo", "c/ Segovia","92458", "eduardo@gmail.com",true, true, false, false, true,"Familia", R.drawable.camaleon));
} catch (Exception e) {
e.printStackTrace();
}
publishProgress("Tarea inicializada");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
publishProgress("Tarea finalizada");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
if(mProgress != null){
mProgress.dismiss
}
mCallback.onAcabeInicializacion(5);
super.onPostExecute(result);
}
@Override
protected void onProgressUpdate(String... values) {
mProgress.setMessage(values[0]);
super.onProgressUpdate(values);
}
}
再次运行您的应用。
修改强>
要清除ArrayList
将此添加到您的活动中:
@Override
public void onStop() {
super.onStop();
miAgenda.clear(); //Clear ArrayList
}