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;
}
你說得對。它擴展了Activity。我是這樣做的,因爲我無法獲得上下文。現在我學到了一些技巧,所以這可能沒有必要。任何解釋爲什麼它不應該擴展Activity?我現在正在進行更改以測試此操作。謝謝! – sfratini
@sfratini:「爲什麼它不應該擴展活動的任何解釋?」 - 因爲它不是一項活動。除非你真的做了一個Activity,否則不要擴展Activity。(例如,把它放在manifest中,通過startActivity()啓動它)。切勿嘗試通過其構造函數創建「活動」。 – CommonsWare
就是這樣!非常感謝你! – sfratini