2013-08-30 4 views
-1

Je souhaite créer un rappelAsyctask générant une exception de tâche future

J'ai créé une base de données. Base de données stocke la date et l'heure. Jusqu'à ici tout fonctionne. Maintenant, je veux exécuter un asynctask en arrière-plan qui vérifie après toutes les quelques secondes s'il y a un nouveau rappel si oui, puis appelle à une autre activité en utilisant l'intention qui génère notificaton. Aussi pour l'archivage de la base de données, il appelle une activité différente. J'ai créé une boucle while infinie afin qu'elle continue à vérifier.

ici est code.In ce que je suis comparais date et l'heure à la date de date et l'heure stockées dans la logique complète de base de données.Le comparaison est écrit en rappel activity.Create_notification est une donnée d'activité a la logique de créer une notification

public class Async_task extends AsyncTask<Void, Void, ArrayList<String>>{ 

MainActivity async_task_context = null; 

public Async_task(MainActivity context) { 
    async_task_context = context; 
    // TODO Auto-generated constructor stub 
} 


@Override 
protected ArrayList<String> doInBackground(Void... params) { 
    // TODO Auto-generated method stub 
    Log.d("in async task", "msg"); 
    while(1<2){ 

     Calendar cal = Calendar.getInstance(); 
     int current_day = cal.get(Calendar.DAY_OF_MONTH); 
     Log.d("in do in background", ""); 
     int cuurent_month = cal.get(Calendar.MONTH); 
     int current_year = cal.get(Calendar.YEAR); 
     int curent_hour = cal.get(Calendar.HOUR_OF_DAY); 
     int current_minute = cal.get(Calendar.MINUTE); 
     String date = current_day+"/"+cuurent_month+"/"+current_year; 
     String time = curent_hour+":"+current_minute; 
     ArrayList<String> arr = new ArrayList<String>(); 
     Reminder fetch_info = new Reminder(async_task_context); 
     fetch_info.open(); 
     arr = fetch_info.fetch(date,time); 
     fetch_info.close(); 
     Log.d("arr in oncreate", ""+arr); 
     int size = arr.size(); 
     if(size !=0){ 
     Intent in = new Intent(async_task_context,Create_notification.class); 
     in.putExtra("information", arr); 
     try { 
      Thread.sleep(9000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     } return arr; 


    } 

en cours d'exécution logcat je suis tombé sur les erreurs suivantes

08-30 18:13:18.701: E/AndroidRuntime(797): java.lang.RuntimeException: An error occured while executing doInBackground() 
08-30 18:13:18.701: E/AndroidRuntime(797): at android.os.AsyncTask$3.done(AsyncTask.java:299) 
08-30 18:13:18.701: E/AndroidRuntime(797): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 
08-30 18:13:18.701: E/AndroidRuntime(797): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
08-30 18:13:18.701: E/AndroidRuntime(797): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
08-30 18:13:18.701: E/AndroidRuntime(797): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
08-30 18:13:18.701: E/AndroidRuntime(797): at android.os.Handler.<init>(Handler.java:197) 
08-30 18:13:18.701: E/AndroidRuntime(797): at com.Itspark.smartreminder.Reminder.<init>(Reminder.java:74) 
08-30 18:13:18.701: E/AndroidRuntime(797): at com.Itspark.smartreminder.Async_task.doInBackground(Async_task.java:36) 

Ci-dessous classe de rappel class.Reminder crée la base de données et il a beaucoup Methode.

public class Reminder extends Activity{ 
public static final String Column_Id="_Id"; 
private static final String name = "Event_Name"; 
private static final String date = "Event_date"; 
private static final String time = "Event_time"; 
private static final String location = "Event_location"; 


private static final String Table_Name="Data_container"; 
private static final String Database_Name="Data_Ship"; 
private static final int Version=1; 


private Context ourcontext; 
private SQLiteDatabase ourSQLiteDatabase; 
private DbHelper ourHelper; 





private static class DbHelper extends SQLiteOpenHelper{ 

    public DbHelper(Context context) { 
     super(context, Database_Name, null, Version); 

    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 



     Log.d("in on create", "before"); 

     db.execSQL("CREATE TABLE "+ Table_Name + "(" +Column_Id+" INTEGER PRIMARY KEY AUTOINCREMENT, " + name +" TEXT NOT NULL, " 
     + date +" TEXT NOT NULL, "+ time +" TEXT NOT NULL, "+ location +" TEXT);"); 
     Log.d("in on create", ""); 


    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) { 

     db.execSQL("DROP TABLE IF EXISTS "+Table_Name); 
     onCreate(db); 
    } 



} 


    public Reminder(Context c) { //**This is line 74** 
    ourcontext = c; 

    } 

public Reminder open(){ 
ourHelper = new DbHelper(ourcontext); 
ourSQLiteDatabase = ourHelper.getWritableDatabase(); 
return this; 

} 

public void close(){ 
    ourHelper.close(); 
} 


    public ArrayList<String> fetch(String date2, String time2) { 
    // TODO Auto-generated method stub 



    String anArray[] = new String[] {Column_Id,name,date,time,location}; 
    Cursor cu = ourSQLiteDatabase.query(Table_Name, anArray, date+" =?"+" AND "+time+" =?", new String[] {date2,time2}, null, null, null); 
    Log.d("after cursor","ere"); 

    int name1=cu.getColumnIndex(name); 
    int date1 = cu.getColumnIndex(date); 
    int time1 = cu.getColumnIndex(time); 
    int location1 = cu.getColumnIndex(location); 
    ArrayList<String> arr = new ArrayList<String>(); 

    for(cu.moveToFirst();!cu.isAfterLast();cu.moveToNext()){ 
     arr.add("Name "+cu.getString(name1)+ "\nDate "+cu.getString(date1)+"\nTime "+cu.getString(time1)+"\nLocation "+cu.getString(location1)); 
    } 
    return arr; 
} 
+0

essayez de commenter le 'sommeil'. Qu'est-ce que tu as? –

+0

Après avoir dormi, je reçois la même exception – user2733908

+0

Que fait la classe 'Reminder'? Plus précisément, que se passe-t-il sur la ligne 74 de 'Reminder.java'? –

Répondre

0

Lieu Thread.sleep dans:

activity.runOnUiThread(new Runnable(){ 
public void run(){ 
Thread.sleep(); 
} 
}); 
+0

Dormir dans le thread _UI_ est encore pire et ne devrait jamais être fait. –

+0

Thnx beaucoup maintenant il travaille – user2733908

+0

@ A - C alors que dois-je faire? – user2733908

0

Vous ne devriez pas dormir dans doInBackground(). Plutôt vous devriez déplacer ce code à OnPostExecute

Ou vous pouvez utiliser runOnUiThread juste ce que l'autre réponse suggéré.

+0

Dormir dans le thread _UI_ est encore pire et ne devrait jamais être fait. –

0

Vous ne pouvez pas accéder au thread UI à partir de la méthode doinbackground.u vous avez besoin de la méthode post execute dans une tâche de synchronisation pour effectuer une tâche sur le thread principal de l'interface utilisateur. U peut passer la liste de tableau à la poste exécuter et peut effectuer le reste du travail à partir de là

Questions connexes