2011-07-16 14 views
0

この問題と可能なすべての解決策を見てきましたが、ここでどのように適用されるか理解できません私はどこから始めたらいいのか分かりません。Android:AsynTaskとデータベースアクティビティでLooper.prepare()を呼び出していないハンドラを作成できません

My MainActiviyは、初めてユーザーがアプリケーションを起動してデータベースに入力するかどうかを確認します。 SQLヘルパーのonCreateは、テーブルを生成します。

初めて実行する場合は、言語をチェックし、データベースに正しいデータを入力するAsyncTaskを呼び出します。データベースに何かを挿入しようとすると、この例外が発生する以外はすべて動作します。私は、コードを乱しているハンドラがどこにあるかわかりません。

すべての手がかりは素晴らしいでしょう! AsyncTaskの

doInBackground:

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) 

これは私のソースコードの一部です:

スタックはこれです

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、またはCategoryActivityのインスタンスを作成しようとしているようです。それをしないでください。

+0

あなたは正しいです。アクティビティを拡張します。私はContextを得ることができなかったので、そのようにしました。今私はいくつかの技術を学んだので、これは必要ではないかもしれません。アクティビティを拡張してはならない理由は何ですか?私はこれをテストするために今変更を行っています。ありがとう! – sfratini

+0

@sfratini:「アクティビティを拡張しない理由は何ですか?」 - それは活動ではないからです。 'Activity'を実際に作っていない限り(例えば、それをマニフェストに入れ、' startActivity() 'で起動しない限り)' Activity'を拡張しないでください。コンストラクタを介して 'Activity'を作成しようとしないでください。 – CommonsWare

+0

それでした!どうもありがとうございました! – sfratini

関連する問題