2011-07-16 47 views
0

讓我首先說我已經看到這個問題以及所有可能的解決方案,但我無法理解它在這裏如何應用所以我不知道從哪裏開始。Android:無法在AsynTask和數據庫活動上創建尚未調用Looper.prepare()的處理程序

我的MainActiviy檢查這是用戶第一次啓動應用程序並填充數據庫。 SQL Helper上的onCreate會創建表格。

如果這是第一次運行,我調用一個AsyncTask來檢查語言,然後用正確的數據填充數據庫。除了當我嘗試在數據庫中插入某些東西時出現此異常外,一切正常。我看不到與代碼混淆的處理程序在哪裏。

任何線索都會很棒!

堆棧是這樣的:

07-16 19:49:06.854: ERROR/DatabaseCreatorTask(10725): Error trying to insert categories:Can't create handler inside thread that has not called Looper.prepare() 
07-16 19:49:06.854: WARN/System.err(10725): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
07-16 19:49:06.854: WARN/System.err(10725):  at android.os.Handler.<init>(Handler.java:121) 
07-16 19:49:06.854: WARN/System.err(10725):  at android.app.Activity.<init>(Activity.java:679) 
07-16 19:49:06.854: WARN/System.err(10725):  at com.objects.Category.<init>(Category.java:19) 
07-16 19:49:06.854: WARN/System.err(10725):  at tasks.DatabaseCreatorTask.fillCategoriesTable(DatabaseCreatorTask.java:58) 
07-16 19:49:06.854: WARN/System.err(10725):  at tasks.DatabaseCreatorTask.doInBackground(DatabaseCreatorTask.java:89) 
07-16 19:49:06.854: WARN/System.err(10725):  at tasks.DatabaseCreatorTask.doInBackground(DatabaseCreatorTask.java:1) 
07-16 19:49:06.854: WARN/System.err(10725):  at android.os.AsyncTask$2.call(AsyncTask.java:185) 
07-16 19:49:06.854: WARN/System.err(10725):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
07-16 19:49:06.854: WARN/System.err(10725):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
07-16 19:49:06.854: WARN/System.err(10725):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) 
07-16 19:49:06.854: WARN/System.err(10725):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) 
07-16 19:49:06.854: WARN/System.err(10725):  at java.lang.Thread.run(Thread.java:1096) 

這是我的源代碼的一部分:

doInBackground中的AsyncTask的:

protected Boolean doInBackground(Void ... strings) { 

     Log.i(LOG_TAG, "doInBackground..."); 

     String lang = PreferencesHelper.getInstance().getSettings(context).getString("lang", "en"); 

     boolean resultCategories = fillCategoriesTable(lang); 

     return (resultCategories); 

    } 

而這一點,如果拋出異常的方法:

private boolean fillCategoriesTable(String lang) { 

    boolean result = true; 
    Log.i(LOG_TAG, "Filling categories..."); 

    if (lang != null && lang.length() > 0) { 

     Log.i(LOG_TAG, "Context: " + context); 
     Log.i(LOG_TAG, "Language: " + lang); 

     if (lang.equalsIgnoreCase("es")) { 

      try { 

       Category cat1 = new Category("Entretenimiento", null); 
       Log.i(LOG_TAG, "Creating new category Entretenimiento:" + cat1.create(this.context)); 

       Category cat2 = new Category("Viajes", null); 
       Log.i(LOG_TAG, "Creating new category Viajes:" + cat2.create(this.context)); 

       Category cat3 = new Category("Comidas", null); 
       Log.i(LOG_TAG, "Creating new category Comidas:" + cat3.create(this.context)); 

      } catch (Exception e) { 
       Log.e(LOG_TAG, "Error trying to insert categories: " + e.getMessage()); 
       e.printStackTrace(); 
       result = false; 
      } 

     } else { 

      try { 

       Category cat1 = new Category("Entertainment", null); 
       Log.i(LOG_TAG, "Creating new category Entertainment:" + cat1.create(this.context)); 

       Category cat2 = new Category("Travel", null); 
       Log.i(LOG_TAG, "Creating new category Travel:" + cat2.create(this.context)); 

       Category cat3 = new Category("Dining", null); 
       Log.i(LOG_TAG, "Creating new category Dining:" + cat3.create(this.context)); 

      } catch (Exception e) { 
       result = false; 
       Log.e(LOG_TAG, "Error trying to insert categories:" + e.getMessage()); 
       e.printStackTrace(); 
      } 

     } 
    } else { 
     Log.w(LOG_TAG, "Lang is null"); 
     result = false; 
    } 

    return result; 

} 

回答

0

您的Category構造函數似乎試圖創建一個Activity的實例,或者Category擴展爲Activity。不要這樣做。

+0

你說得對。它擴展了Activity。我是這樣做的,因爲我無法獲得上下文。現在我學到了一些技巧,所以這可能沒有必要。任何解釋爲什麼它不應該擴展Activity?我現在正在進行更改以測試此操作。謝謝! – sfratini

+0

@sfratini:「爲什麼它不應該擴展活動的任何解釋?」 - 因爲它不是一項活動。除非你真的做了一個Activity,否則不要擴展Activity。(例如,把它放在manifest中,通過startActivity()啓動它)。切勿嘗試通過其構造函數創建「活動」。 – CommonsWare

+0

就是這樣!非常感謝你! – sfratini

相關問題