9

Mi actividad llamada:termina la actividad llamada cuando AsyncTask completa

public class Hello extends Activity { 

public void onCreate(Bundle savedInstanceState) { 

    MyTask mt = new MyTask(this); 
    mt.execute(); 
} 

Ahora En MyTask (una clase externa):

public class MyTask extends AsyncTask<Void, Void, Void> { 
private Context mContext; 

public MyTask(Context context) { 

    mContext = context; 
} 

//doinbackground, etc 

    protected void onPostExecute() { 
    mContext.finish(); 

} 

Otras cosas están funcionando como se esperaba si quito mContext.finish() anteriormente.
Pero si yo estoy llamando mContext.finish(), estoy recibiendo un error: The method finish() is undefined for the type Context (.. Eclipse no muestra acabado() cuando escribo mContext lo que nos demuestra que estoy usando acabado() sin ella)

Lo Qué necesito hacer para terminar la actividad de llamadas Hello después MyTask completa la tarea

+0

¿Qué pasa si usted escribe Hello.this.finish()? – user370305

+0

@ user370305: Ya lo intenté pero dice: 'No hay ninguna instancia adjunta del tipo Hello accesible en el alcance' –

Respuesta

-4

se puede tratar

this.finish() 

parece que es debido a que calificó utilizando mContext que dice indefinido.

+0

Me temo que no funcionará, ya que finish() no se puede ejecutar en una AsyncTask, pero solo en una actividad. Da este error: 'El método finish() no está definido para el tipo MyTask' –

16

Lo que se puede tratar de hacer en lugar de llamar context.finish(), ¿por qué no haces una interfaz de devolución de llamada de esta manera:

public interface TaskCallback{ 
void done(); 
} 

Entonces decide implementar esta forma en su actividad

public Hello extends Activity implements TaskCallback{ 

    .....BUNCH OF ACTIVITY CODE..... 

public void onCreate(Bundle savedInstanceState) { 

    MyTask mt = new MyTask(this); 
    mt.execute(); 
} 

public void done() { 
    finish(); 
} 

} 

Y en lugar de tener Contexto como un parámetro que tiene TaskCallback

public class MyTask extends AsyncTask<Void, Void, Void> { 
private TaskCallback mCallback; 

public MyTask(TaskCallback callback) { 

    mCallback = callback; 
} 

//doinbackground, etc 

    protected void onPostExecute() { 
    mCallback.done(); 

} 

Hay que ir, le da más flexibilidad para personalizar cada implementación.

+0

Si en lugar de Context aprobamos TaskCallback, entonces no puedo hacer nada en la interfaz de usuario en MyTask como' new ProgressDialog (mContext); 'que Pude hacer previamente –

+0

, todavía puede convertir TaskCallback en un Contexto, o también puede implementar un método para su progreso aparte de done(), otra alternativa es crear un contexto como Actividad y verificarlo con instanceof – Necronet

+0

. es genial, muchas gracias. – Mafro34

17
((Activity)mContext).finish(); 

sería la forma correcta de lanzar un Context a un Activity y llamar a su método finish(). No estoy seguro de por qué querría terminar un Activity desde un AsyncTask aunque

+1

Muchas gracias @MisterSquonk (y otras personas que intentaron ayudar). La razón por la que necesitaba esto era que a partir de una actividad A, llamaba a la Actividad B, en la que llamaba a AsyncTask y no necesitaba la Actividad B después de que se realizaba la tarea, por eso quería terminarla tan pronto como la tarea está hecha. –

+0

Vaya, no funciona y recibo una Excepción de tiempo de ejecución: 'java.lang.ClassCastException' –

0

Puede crear un nuevo AsyncTask privado extendido desde el público.

En esta AsyncTask privada tiene acceso a las actividades y puede anular el método onPostExecute para terminarlo.

Su verdaderamente AsyncTask

public class MyPublicAsyncTask extends AsyncTask<Void, Void, Void> { 
    Context context; 
    public GetHorariosAsyncTask(Context ctx){ 
     context = ctx; 
    } 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     // prepare yourself for an async work 
    } 
    @Override 
    protected Void doInBackground(Void... params) { 
     // Do yout cool async stuff 
    } 
    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
     // you're finish, let's tell to user 
    } 
} 

su actividad con AsyncTask privada

public class MyActivity extends Activity { 
    Activity mAct; 

    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     mAct = this; 
    } 

    private class MyPrivateAsyncTask extends MyPublicAsyncTask { 

     public MyPrivateAsyncTask(Context ctx) { 
      super(ctx); 
      // TODO Auto-generated constructor stub 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      // TODO Auto-generated method stub 
      super.onPostExecute(result); 
      // our async task is completed! let's take care of this activity 
      mAct.finish(); 
     } 

    } 
} 
1

definir un método en la clase de actividad como esta:

public void FinishAfterAsyncTask() 
{ 
    this.finish(); 
} 

Y llame a este método desde el método OnPostExecute de la clase AsynTask.

2

Me dio la misma situación, entonces lo hago de la siguiente manera:

public class MyTask extends AsyncTask<Void, Void, Void> { 
private Activity mActivity; 
private Context mContext; 

public MyTask(Activity activity) { 
    mActivity = activity; 
    mContext = mActivity.getApplicationContext(); 
} 

//doinbackground, etc 

protected void onPostExecute() { 
    mActivity.finish(); 

} 

espero que ayude :)

Cuestiones relacionadas