Java 安卓:Can';t在AsynTask和数据库活动上创建尚未调用Looper.prepare()的处理程序

Java 安卓:Can';t在AsynTask和数据库活动上创建尚未调用Looper.prepare()的处理程序,java,android,android-asynctask,Java,Android,Android Asynctask,让我首先说,我已经看到了这个问题和所有可能的解决方案,但我不明白它如何适用于这里,所以我不知道从哪里开始 我的主要活动是检查用户是否是第一次启动应用程序并填充数据库。SQL帮助器上的onCreate创建表 如果这是它第一次运行,我将调用一个异步任务来检查语言,然后用正确的数据填充数据库。一切都正常,只是当我尝试在数据库中插入某些内容时出现了此异常。我看不出正在处理代码的处理程序在哪里 任何线索都很好 堆栈是这样的: 07-16 19:49:06.854: ERROR/DatabaseCreato

让我首先说,我已经看到了这个问题和所有可能的解决方案,但我不明白它如何适用于这里,所以我不知道从哪里开始

我的主要活动是检查用户是否是第一次启动应用程序并填充数据库。SQL帮助器上的onCreate创建表

如果这是它第一次运行,我将调用一个异步任务来检查语言,然后用正确的数据填充数据库。一切都正常,只是当我尝试在数据库中插入某些内容时出现了此异常。我看不出正在处理代码的处理程序在哪里

任何线索都很好

堆栈是这样的:

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)
如果抛出异常的方法:

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;

}

您的
类别
构造函数似乎正在尝试创建
活动
的实例,或者可能是
类别
扩展
活动
。不要那样做。

你是对的。它扩展了活动。我这样做是因为我无法获得上下文。现在我学习了一些技巧,所以这可能不是必要的。有没有解释为什么它不应该扩展活动?我现在正在进行更改以测试这一点。谢谢@斯弗拉蒂尼:“有什么解释为什么它不应该扩展活动吗?”——因为它不是活动。不要扩展
活动
,除非您真的在进行
活动
(例如,将其放入清单中,通过
startActivity()
启动)。永远不要试图通过构造函数创建
活动。就是这样!非常感谢你!
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;

}