异步任务不执行doinBackground

时间:2014-12-27 13:38:00

标签: android eclipse android-asynctask dialog progressdialog

在很多人的帮助下,我得到了这个代码:但我面临两个问题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);
}

}

2 个答案:

答案 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
}