2013-08-30 31 views
-1

我想创建一个提醒Asyctask生成未来任务异常

我已经创建了一个数据库。数据库存储日期和时间。到此为止一切正常。 现在,我想在后台运行一个asynctask,每隔几秒钟后会检查是否有新的提醒,如果是,则使用生成notificaton的意向调用另一个活动。同样为了检入数据库,它正在调用不同的活动。我创建了一个无限循环,以便它继续检查。

这里是代码。在这里我比较当前日期和时间与数据库中存储的日期日期和时间。比较的完整逻辑写在提醒活动中。创建通知是活动数据具有创建通知的逻辑

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; 


    } 

在运行logcat我碰到下面的错误

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) 

下面是提醒class.Reminder类是创建数据库和它有许多梅索德。

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

尝试将'sleep'注释掉。你得到了什么? –

+0

评论睡眠后,我得到同样的例外 – user2733908

+0

'提醒'类做什么?具体来说,'Reminder.java'的'74行'是什么? –

回答

0

地点Thread.sleep在:

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

在_UI_线程中睡觉更糟糕,不应该这样做。 –

+0

thnx现在很多工作 – user2733908

+0

@ A - C那么我该怎么办? – user2733908

0

你不应该在doInBackground()睡眠。相反,您应该将此代码移动到OnPostExecute

或者您可以使用runOnUiThread正如其他答案所示。

+0

在_UI_线程中睡觉更糟糕,不应该这样做。 –

0

U无法从doinbackground method.u中访问UI线程需要同步任务中的post执行方法才能在主UI线程上执行任何任务。 U可以将数组列表传递给post执行,并且可以从那里执行剩余的工作。