I need to run the following code every 30 seconds.
public void push(Context context,String codigoEvento){
SessionManager manager = new SessionManager();
folioEvento = manager.getValue(context,"folioEvento");
nombreCliente = manager.getValue(context,"nombreCliente");
nombreUser = manager.getValue(context, "nombreUser");
hashUser = manager.getValue(context, "hashUsuario");
if(!(folioEvento.equals("") || nombreCliente.equals(""))){
Connection cn = new Connection();
if(cn.isNetworkAvailable(context)){
String ids = "";
SQLiteDatabase db = TicketsBaseDatos.getInstance(context).getWritableDatabase();
Cursor c = db.rawQuery("SELECT inscripcion_id FROM Inscripcion WHERE validado=1 and sincronizado = 1",null);
if (c.moveToFirst()) {
do {
ids += c.getString(0)+",";
ContentValues valores = new ContentValues();
valores.put("sincronizado","1");
String[] args = new String[]{c.getString(0), codigoEvento};
db.update("Inscripcion", valores, "inscripcion_id=? AND codigo_evento=?", args);
} while(c.moveToNext());
}
db.close();
c.close();
JSONParser jParser = new JSONParser();
JSONObject json = jParser.getJSONFromUrl(Config.URL_BASE+nombreCliente+"/"+Config.URL_PUSH+nombreUser+"/"+hashUser+"/"+folioEvento+"/"+ids);
try {
String status = json.getString("status");
if(status.equals("1")){
System.out.println("BIEN");
}
else{
System.out.println("MAL");
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}
Following that, the user will be able to download data from a Web service, is the following code, this task, I do it within a AsyncTask :
public void sincronizarBD(Context context, String codigoEvento) {
Connection cn = new Connection();
if(cn.isNetworkAvailable(context)){
SessionManager manager = new SessionManager();
folioEvento = manager.getValue(context,"folioEvento");
nombreCliente = manager.getValue(context,"nombreCliente");
codigoUser = manager.getValue(context,"codigoUser");
nombreUser = manager.getValue(context, "nombreUser");
hashUser = manager.getValue(context, "hashUsuario");
JSONParser jParser = new JSONParser();
BaseDeDatos nueva = new BaseDeDatos();
try {
do{
int recorrido = 0;
JSONObject json = jParser.getJSONFromUrl(Config.URL_BASE+nombreCliente+"/"+Config.URL_DESCARGA_BD+nombreUser+"/"+hashUser+"/"+folioEvento+"/"+start+"/"+cantidad);
JSONArray array = json.getJSONArray("Inscripciones");
for (int i = 0; i < array.length(); i++) {
recorrido++;
JSONObject rowParticipante = array.getJSONObject(i);
SQLiteDatabase db = TicketsBaseDatos.getInstance(context).getWritableDatabase();
System.out.println(i);
ContentValues nuevoRegistro = new ContentValues();
nuevoRegistro.put("hash", rowParticipante.getString("hash"));
nuevoRegistro.put("codigo_evento", rowParticipante.getString("codigo_evento"));
nuevoRegistro.put("ticket",rowParticipante.getString("ticket"));
nuevoRegistro.put("nombre",rowParticipante.getString("nombre"));
nuevoRegistro.put("inscripcion_id",rowParticipante.getString("inscripcion_id"));
nuevoRegistro.put("validado", rowParticipante.getInt("validado"));
nuevoRegistro.put("sincronizado", 0);
nuevoRegistro.put("numero", rowParticipante.getString("numero"));
nuevoRegistro.put("categoria", rowParticipante.getString("categoria"));
nuevoRegistro.put("codigo_usuario", codigoUser);
nuevoRegistro.put("rut", rowParticipante.getString("rut_clean"));
nuevoRegistro.put("talla", rowParticipante.getString("talla"));
System.out.println("Guardado con exito");
db.insert("Inscripcion", null, nuevoRegistro);
nuevoRegistro.clear();
db.close();
}
if(recorrido>0){
start = start + cantidad;
} else {
continuar = false;
}
}while(continuar == true);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
Here is the error when I do "pull" while download in "sincronizarBD" throws me error.
03-28 02:30:14.547: E/AndroidRuntime(16117): FATAL EXCEPTION: AsyncTask #3
03-28 02:30:14.547: E/AndroidRuntime(16117): java.lang.RuntimeException: An error occured while executing doInBackground() 03-28 02:30:14.547: E/AndroidRuntime(16117): at android.os.AsyncTask$3.done(AsyncTask.java:299) 03-28 02:30:14.547: E/AndroidRuntime(16117): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 03-28 02:30:14.547: E/AndroidRuntime(16117): at java.util.concurrent.FutureTask.setException(FutureTask.java:219) 03-28 02:30:14.547: E/AndroidRuntime(16117): at java.util.concurrent.FutureTask.run(FutureTask.java:239) 03-28 02:30:14.547: E/AndroidRuntime(16117): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 03-28 02:30:14.547: E/AndroidRuntime(16117): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 03-28 02:30:14.547: E/AndroidRuntime(16117): at java.lang.Thread.run(Thread.java:856) 03-28 02:30:14.547: E/AndroidRuntime(16117): Caused by: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/data/com.androidaz.scanner/databases/Eventrid 03-28 02:30:14.547: E/AndroidRuntime(16117): at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55) 03-28 02:30:14.547: E/AndroidRuntime(16117): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1543) 03-28 02:30:14.547: E/AndroidRuntime(16117): at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1445) 03-28 02:30:14.547: E/AndroidRuntime(16117): at com.androidaz.scanner.Sincronizacion.sincronizarBD(Sincronizacion.java:73) 03-28 02:30:14.547: E/AndroidRuntime(16117): at com.androidaz.scanner.MenuEvento$sincronizarBD.doInBackground(MenuEvento.java:205) 03-28 02:30:14.547: E/AndroidRuntime(16117): at com.androidaz.scanner.MenuEvento$sincronizarBD.doInBackground(MenuEvento.java:1) 03-28 02:30:14.547: E/AndroidRuntime(16117): at android.os.AsyncTask$2.call(AsyncTask.java:287) 03-28 02:30:14.547: E/AndroidRuntime(16117): at java.util.concurrent.FutureTask.run(FutureTask.java:234)
My SQLhelper
public class TicketsBaseDatos extends SQLiteOpenHelper {
String sqlCreateBDEvent = "CREATE TABLE IF NOT EXISTS Evento (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, codigo_evento TEXT , nombre TEXT, codigo_usuario TEXT, folio TEXT, nombre_cliente TEXT)";
String sqlCreateBDInscripcion = "CREATE TABLE IF NOT EXISTS Inscripcion (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, hash TEXT, codigo_evento TEXT, ticket TEXT, nombre TEXT, inscripcion_id TEXT, validado int, sincronizado int, numero TEXT, categoria TEXT, codigo_usuario TEXT, rut TEXT, talla TEXT)";
private static TicketsBaseDatos sInstance;
public static TicketsBaseDatos getInstance(Context context) {
if (sInstance == null) {
sInstance = new TicketsBaseDatos(context.getApplicationContext());
}
return sInstance;
}
public TicketsBaseDatos(Context ctx) {
super(ctx, "Eventrid", null, 1);
}
}
To run for a while my push action, occupy Timer :
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Sincronizacion s = new Sincronizacion();
SessionManager ss = new SessionManager();
try{
codigoEvento = ss.getValue(this,"codigoEvento");
folioEvento = ss.getValue(this,"folioEvento");
nombreCliente = ss.getValue(this,"nombreCliente");
if((codigoEvento != null) && (!codigoEvento.equals("") && (folioEvento != null) && (!folioEvento.equals("") && (nombreCliente != null) && (!nombreCliente.equals(""))))){
s.push(getApplicationContext(), codigoEvento);
s.pull(getApplicationContext(), codigoEvento);
Toast.makeText(this, "PULL Y PUSH", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this, "Push sin codigo", Toast.LENGTH_SHORT).show();
}
}catch(Exception e){
Toast.makeText(this, "NO HAY CODIGOS", Toast.LENGTH_SHORT).show();
}
return START_STICKY;
}
cronTimerTask = new TimerTask() {
@Override
public void run() {
startService(new Intent(getBaseContext(), CronPush.class));
}
};
cron = new Timer();
cron.schedule(cronTimerTask, 0, 30000);
Because I threw this error? Any solution?