2014-01-06 2 views
0

Я новичок в программировании для Android. Я пишу простое приложение, которое должно выполнить sql-файл в первом запуске. Но кажется, что этот процесс занимает пару секунд, поэтому я полагаю, что приложение должно показывать progressDialog, пока он будет исполнять sql-файл. Но когда я пытаюсь запустить приложение, открывается диалоговое окно с сообщением «приложение остановилось ...». Пожалуйста, помогите мне.Показать прогрессDialog в SQLiteOpenHelper onCreate метод

@Override 
public void onCreate(SQLiteDatabase database) 
{ 
    String CREATE_BIBLE_TABLE = "CREATE TABLE bible (" + 
      "id INTEGER PRIMARY KEY AUTOINCREMENT, " + 
      "book INTEGER, " + 
      "chapter INTEGER NOT NULL, " + 
      "verse INTEGER NOT NULL, " + 
      "content TEXT" + 
      ")"; 
    database.execSQL(CREATE_BIBLE_TABLE); 

    new FirstLoadAsyncTask(database).execute(); 
} 

public class FirstLoadAsyncTask extends AsyncTask<Void, Void, Void> 
{ 
    private SQLiteDatabase database; 
    private ProgressDialog progressDialog; 

    public FirstLoadAsyncTask(SQLiteDatabase database) 
    { 
     this.database = database; 
    } 

    @Override 
    protected void onPreExecute() 
    { 
     ((Activity) context).runOnUiThread(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       progressDialog = ProgressDialog.show(context, "Loading...", ""); 
      } 
     }); 
    } 

    @Override 
    protected Void doInBackground(Void... params) 
    { 
     try 
     { 
      InputStream inputStream = context.getAssets().open("bible.sql"); 
      execSqlFile(database, inputStream); 
     } catch(IOException e) 
     { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) 
    { 
     progressDialog.dismiss(); 
    } 
} 

Класс расширяет SQLiteOpenHelper.

Edit: Logcat:

01-06 18:27:53.221 14118-14118/pl.several27.Biblia_Warszawska E/Trace﹕ error opening trace file: No such file or directory (2) 
01-06 18:27:53.891 14118-14118/pl.several27.Biblia_Warszawska I/Adreno200-EGL﹕ <qeglDrvAPI_eglInitialize:299>: EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_JB_REL_2.0.3.04.01.02.21.081_msm7627a_JB_REL_2.0.3_CL2820657_release_AU (CL2820657) 
    Build Date: 01/22/13 Tue 
    Local Branch: 
    Remote Branch: quic/jb_rel_2.0.3 
    Local Patches: NONE 
    Reconstruct Branch: AU_LINUX_ANDROID_JB_REL_2.0.3.04.01.02.21.081 + NOTHING 
01-06 18:27:54.001 14118-14118/pl.several27.Biblia_Warszawska E/copybit﹕ Error opening frame buffer errno=13 (Permission denied) 
01-06 18:27:54.001 14118-14118/pl.several27.Biblia_Warszawska W/Adreno200-EGLSUB﹕ <updater_create_surface_state:342>: updater_create_surface_state failed to open copybit, error: -13 
01-06 18:27:54.011 14118-14118/pl.several27.Biblia_Warszawska D/memalloc﹕ ion: Mapped buffer base:0x53be8000 size:1536000 offset:0 fd:61 
01-06 18:27:54.021 14118-14118/pl.several27.Biblia_Warszawska D/memalloc﹕ ion: Mapped buffer base:0x5083a000 size:4096 offset:0 fd:63 
01-06 18:27:54.381 14118-14118/pl.several27.Biblia_Warszawska D/memalloc﹕ ion: Mapped buffer base:0x541fb000 size:1536000 offset:0 fd:66 
01-06 18:27:54.381 14118-14118/pl.several27.Biblia_Warszawska D/memalloc﹕ ion: Mapped buffer base:0x50a50000 size:4096 offset:0 fd:68 
01-06 18:27:54.501 14118-14118/pl.several27.Biblia_Warszawska D/memalloc﹕ ion: Mapped buffer base:0x54472000 size:1536000 offset:0 fd:70 
01-06 18:27:54.501 14118-14118/pl.several27.Biblia_Warszawska D/memalloc﹕ ion: Mapped buffer base:0x50c75000 size:4096 offset:0 fd:72 
01-06 18:27:55.001 14118-14118/pl.several27.Biblia_Warszawska D/memalloc﹕ ion: Mapped buffer base:0x545e9000 size:1536000 offset:0 fd:74 
01-06 18:27:55.001 14118-14118/pl.several27.Biblia_Warszawska D/memalloc﹕ ion: Mapped buffer base:0x50d4c000 size:4096 offset:0 fd:76 
01-06 18:27:57.231 14118-14118/pl.several27.Biblia_Warszawska D/book choosen﹕ 1 
01-06 18:27:57.581 14118-14118/pl.several27.Biblia_Warszawska W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x40ca4540) 
01-06 18:27:57.601 14118-14118/pl.several27.Biblia_Warszawska E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{pl.several27.Biblia_Warszawska/pl.several27.Biblia_Warszawska.ChapterActivity}: java.lang.ClassCastException: android.app.Application cannot be cast to android.app.Activity 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2355) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2391) 
      at android.app.ActivityThread.access$600(ActivityThread.java:151) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1335) 
      at android.os.Handler.dispatchMessage(Handler.java:99) 
      at android.os.Looper.loop(Looper.java:155) 
      at android.app.ActivityThread.main(ActivityThread.java:5520) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:511) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:796) 
      at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.ClassCastException: android.app.Application cannot be cast to android.app.Activity 
      at pl.several27.Biblia_Warszawska.Database$FirstLoadAsyncTask.onPreExecute(Database.java:58) 
      at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586) 
      at android.os.AsyncTask.execute(AsyncTask.java:534) 
      at pl.several27.Biblia_Warszawska.Database.onCreate(Database.java:42) 
      at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252) 
      at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188) 
      at pl.several27.Biblia_Warszawska.Database.countChapters(Database.java:148) 
      at pl.several27.Biblia_Warszawska.ChapterActivity.onCreate(ChapterActivity.java:32) 
      at android.app.Activity.performCreate(Activity.java:5066) 
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1101) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2311) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2391) 
            at android.app.ActivityThread.access$600(ActivityThread.java:151) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1335) 
            at android.os.Handler.dispatchMessage(Handler.java:99) 
            at android.os.Looper.loop(Looper.java:155) 
            at android.app.ActivityThread.main(ActivityThread.java:5520) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:511) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:796) 
            at dalvik.system.NativeStart.main(Native Method) 
01-06 18:27:59.511 14118-14118/pl.several27.Biblia_Warszawska D/Process﹕ killProcess, pid=14118 
01-06 18:27:59.521 14118-14118/pl.several27.Biblia_Warszawska D/Process﹕ dalvik.system.VMStack.getThreadStackTrace(Native Method) 
01-06 18:27:59.521 14118-14118/pl.several27.Biblia_Warszawska D/Process﹕ java.lang.Thread.getStackTrace(Thread.java:599) 
01-06 18:27:59.521 14118-14118/pl.several27.Biblia_Warszawska D/Process﹕ android.os.Process.killProcess(Process.java:956) 
01-06 18:27:59.521 14118-14118/pl.several27.Biblia_Warszawska D/Process﹕ com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:108) 
01-06 18:27:59.531 14118-14118/pl.several27.Biblia_Warszawska D/Process﹕ java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693) 
01-06 18:27:59.531 14118-14118/pl.several27.Biblia_Warszawska D/Process﹕ java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690) 
01-06 18:27:59.531 14118-14118/pl.several27.Biblia_Warszawska D/Process﹕ dalvik.system.NativeStart.main(Native Method) 

Также я попробовал этот способ display progressdialog in non-activity class, но это не будет работать тоже.

И здесь весь исходный код приложения, но без диалога: https://github.com/several27/BibliaWarszawska_Android

Пожалуйста, кто может мне помочь?

+0

Вам нужно чтобы увидеть logCat, но я думаю, что проблема заключается в том, что вам нужно вызвать метод 'free(), как вы e вызывает метод 'show()', а 'RunOnUiThread' –

+0

onPreExecute() уже работает в потоке пользовательского интерфейса. Вам не нужно создавать объект Runnable. Редактировать: Кроме того, вы можете передать объект контекста в конструкторе AsyncTask и использовать его для ProgressDialog. Чтобы получить дополнительную информацию, вы должны отправить данные журнала. –

+0

'((Activity) context)' не работает, поскольку контекст не является активностью. плюс, это бесполезно, как уже объяснялось. – njzk2

ответ

1

я сделать что-то подобное, что в моем приложении, но я предпочитаю делать это на фоне, так что пользователь просто не имеет доступа к экранам, которые зависят от моей базы данных ...

Вы можете попробовать что-то вроде что:

public class BackgroundSyncService extends IntentService { 

    public static final String NOTIFICATION = "com.example.sync.service"; 
public static final String RESULT = "result"; 

    public BackgroundSyncService() { 
    super("BackgroundSyncService"); 
} 

    @Override 
protected void onHandleIntent(Intent intent) { 
    //Do here what you want with your database 

    //After all process you just notify your activitys 
    Intent intent = new Intent(NOTIFICATION); 
    intent.putExtra(RESULT, result); 
sendBroadcast(intent); 
    } 

} 

Создать приемник (я использую внутренний класс в моем проекте)

private BroadcastReceiver receiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      Bundle bundle = intent.getExtras(); 
      if (bundle != null) { 
        //Do what you want here , like enable a section of your app 
      } 
     } 
    }; 

Затем вам нужно зарегистрировать службу вашей деятельности добавив:

registerReceiver(receiver, new IntentFilter(BackgroundSyncService.NOTIFICATION)); 

Не забудьте отменить приемник:

@Override 
    protected void onPause() { 
     super.onPause(); 
     unregisterReceiver(receiver); 
    } 

Также не забудьте зарегистрировать IntentService на AndroidManifest.xml

<service android:name="com.example.service.BackgroundSyncService" /> 

РЕДАКТИРОВАНИЕ

Также вам необходимо включить вызов, чтобы начать службу, где вы муравей, я начинаю мое на экземпляре App:

Intent intent = new Intent(this, BackgroundSyncService.class); 
startService(intent); 

ОБЪЯСНЕНИЕ

Сначала вы создаете сервис, чтобы сделать то, что вы хотите, служба может делать все, что вы хотите, в вашем случае, вы будете заполнить база данных ...

После того, как вы создали эту услугу, вы установите, когда хотите запустить эту службу (часть редактирования) ...

После того, что вы будете зарегистрировать вашу деятельность, чтобы послушать службы Вот почему мы создали BroadcastReceiver, то BroadcastReceiver будет вызываться, когда ваша служба выполнить строку:

//After all process you just notify your activitys 
    Intent intent = new Intent(NOTIFICATION); 
    intent.putExtra(RESULT, result); 
    sendBroadcast(intent); 
+0

Я совершенно новый, как писал. Не могли бы вы объяснить мне, что именно будет делать этот код? –

+0

@MaciejSzpakowski только что отредактировал ответ ... – GhostDerfel

+0

Итак, я понимаю, что таким образом все «исполнение» будет скрыто, а пользователь будет просто использовать приложение без какого-либо диалога? Я только хочу выполнить этот sql один раз, после первой установки приложения, и приложение не может работать без него, я думаю, приложение должно показать этот диалог. –

0

Я думаю, лучший способ, когда приложение начинает вы представляете пользователю сообщение/действие, которое не связано с базой данных или просто использует заставку во время загрузки и оценивает время, которое оно обычно заканчивает загрузкой, чтобы быть таймером заставки.

Смежные вопросы