7

He estado usando mi clase de actividad para acceder a mi base de datos, lo que hace que mi programa se congele a veces.¿Cómo usar SQLite DB de AsyncTask?

Así que decidí usar AsyncTask en su lugar para manejar la base de datos.

Mi problema es que no sé cómo crear una instancia de mi SQLite DB "TheDB" de la clase de AsyncTask

public class myClass extends AsyncTask<Void, Void, Void>{ 
private TheDB db; 

any method() { 
    this.db = new TheDB(this); //<-- Error here 
} 

esto funcionó muy bien en la clase de actividad, pero no sé cómo usarlo aquí

El constructor de TheDB es TheDB (Context context) pero esta clase no es un "contexto", entonces ¿cómo puedo usar mi DB aquí?

den ejemplos si se puede

y por favor no me da enlaces a referencias de Google, soy muy novato y me los encuentro difícil de seguir

Respuesta

9

que necesita para aprobar el contexto de aplicación aquí

this.db = new TheDB(getApplicationContext()); 
+0

hi brotha, lo intenté pero dice "El método getApplicationContext() no está definido para el tipo myClass", ¿alguna sugerencia??!? – ZiGi

+3

Necesita crear una instancia de la tarea Async dentro de su actividad como Clase interna. –

+0

¡esa es la única! funciona como un amuleto, gracias montones hermano! – ZiGi

-1

Una parte importante de aprender a programar está aprendiendo a leer y entender la documentación. A medida que avanza la documentación, los documentos de Android son bastante detallados, por lo que realmente vale la pena su tiempo para comprender cómo funcionan.

Como puede ver en el AsyncTask docs, no hay un método onCreate o onExecute en un AsyncTask.

Los documentos que caminan claramente a través de las 4 funciones principales de un AsyncTask, onPreExecute(), doInBackground(Params...), onProgressUpdate(Progress...), onPostExecute(Result).

Las opciones probables para su instancia son onPreExecute() o doInBackground(Params...). La diferencia es si desea que la inicialización ocurra en el hilo de la interfaz de usuario. Si no lo hace, hágalo en doInBackground(Params...).

+0

Hola, brotha, gracias por la respuesta rápida, implementé esto automáticamente "usando Eclipse IDE" pero aún donde sea que use la línea "this.db = new TheDB (this);" sin embargo, "esto" no es un contexto, por lo que no se puede usar para crear instancias de la base de datos. Entonces, ¿cómo usar el DB de esta clase? si hay una forma diferente – ZiGi

+0

Como dijo khotmanship, puedes usar una clase interna dentro de tu Actividad para acceder al contexto de la actividad. –

6
import android.content.Context; 

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

    public SuperTask(Context context) { 
     super(); 
     this.mContext = context 
    } 

    protected Void doInBackground(Void... params) { 
     // using this.mContext 
    } 
} 

public class MainActivity extends Activity { 
    // and run from Activity 
    public void onButtonClick(View view) { 
     new SuperTask(this.getApplicationContext()).execute(); 
    } 
} 
0

Hay dos maneras que veo:

  1. pasar un objeto de contexto a su constructor AsyncTask, a continuación, crear instancias de base de datos como this this.db = new TheDB (context);

  2. O probablemente pueda pasar el objeto de base de datos real al constructor, pero el primer enfoque parece mejor.