2010-09-02 2 views
0

У меня есть приложение, которое должно создать базу данных, и если это не удастся, тогда нет смысла двигаться вперед. Я построил AlertDialog и show(), но он никогда не отображается. Логика проходит через, а затем barfs из-за недостающей базы данных.Каков наилучший способ остановить активность и предупредить пользователя?

Каков правильный/лучший способ вызвать сообщение и остановить работу? Приведенный ниже код выполняет штраф (значение show() происходит во время отладки, и оно переходит к следующей строке), но пользовательский интерфейс никогда не отображает это предупреждение. BTW - я понимаю, что бросок может быть не самым изящным, но я даже не добираюсь так далеко ... B ^).

try { 

    myDBHelp.createDataBase(); 
} catch (IOException ioe) { 
    new AlertDialog.Builder(this).setCancelable(false) 
     .setMessage(ioe.getMessage()) 
     .setTitle("Database Create Failed") 
     .setPositiveButton("Quit", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       throw new Error("Unable to create database - please try uninstall/reinstall"); 
      } 
     }) 
     .show(); 

ответ

0

Я Ususally сделать что-то вроде этого:

void myFunction() { 

    try { 
     somecode.. 
    } catch (IOException e){ 
     e.printStackTrace(); 
     doToast("Unknown Error"); //Display Toast to user 
     return;   //Leave myFunction 
    } 

    somecode... //If no error continue here 

    return; 
} 

protected void doToast(final String str) { 
    this.runOnUiThread(new Runnable() { 
     public void run() { 
      Toast.makeText(myClass.this, str, Toast.LENGTH_SHORT).show(); 
     } 
    }); 

} 
+0

Использование тоста конечно же верно, но мне интересно, была ли у меня такая же проблема. Проблема в том, что пользовательский интерфейс не показывал мой диалог, пока он не запутался. Оказывается, переопределенная функция onResume() выполнялась до того, как появилось диалоговое окно, и там не сработало, поскольку код ожидал базы данных. Я должен был ввести логическое значение и проверить/выполнить только этот зависимый код, если нет предыдущих ошибок. После завершения операции onResume() появится диалоговое окно. Я уверен, что Toast будет работать, как только я защищу код onResume(). Благодарю. – teachableMe

0

Я не знаю, что течет у use.But есть предложение U может сделать это следующим образом.

U может начать операцию базы данных, как это ..

Намерение I = новый Intent (это, Databaseoperation.class); начальная активность (i); ............................... это сделает элементы управления для перехода к классу базы данных , он выполняет различные операции, такие как open. закрыть, insert удалить..etc.

U можно расширить databasehelper во встроенном классе

и теперь, когда любая проблема в открытии базы данных или любой материала, отделки() намерения и вернуться к основной деятельности ...

U может сделать это как это ..

благодаря Ракеш

+0

Rakesh- проблема не в том, чтобы поймать ошибку. Это позволяет пользователю узнать, что что-то пошло не так, и предотвращение появления и разрывания бесполезного кода. Интересно, может ли использование Intent сделать это хуже - ногами асинхронного потока базы данных, когда на самом деле я хочу заблокировать/дождаться, когда это закончится - нет базы данных, никакого приложения. – teachableMe

0

Выполняет ли createDataBase() ошибку или обрабатывает ее сам? Если он обрабатывает само исключение, то он никогда не достигает вашего внешнего блока, и поэтому вы никогда не проходите через блок catch. Убедитесь в том, чтобы иметь throws IOException добавили в конце подписи методы, как это:

public void createDataBase() throws IOException {[...]} 

Кроме того, убедитесь, чтобы не иметь какие-либо попытку/уловы блоков улавливающих IOException внутри из createDataBase().

Таким образом, всякий раз, когда происходит IOException, он делегируется вашему внешнему блоку catch и появляется ваше диалоговое окно.

+0

О, черт возьми, почему это было под новыми вопросами ... Я только заметил, что этому посту почти 7 лет ...... – Aenadon