2016-10-14 2 views
-1

Мне нужно сделать массивное манипулирование sql (слишком много вставок) в начале приложения. У меня такой заставка.Рабочий класс вне ui thread

public class SplashScreen extends AppCompatActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ... 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     ... 
     new SetupDataBaseWorker(this).execute(); 
    } 
    private class SetupDataBaseWorker extends AsyncTask<Void, Void, Void> { 
     private SqliteManager db_sql; 
     private Activity activity; 

     public SetupDataBaseWorker(Activity activity) { 
      this.activity = activity; 

      db_sql = new SqliteManager(this.activity); 
     } 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      ... 
      showDialogLoading(); 
      ... 
     } 

     @Override 
     protected Void doInBackground(Void... urls) { 
      ... 
      db_sql.inserting(); 
      ... 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 

      this.activity.startActivity(new Intent(SplashScreen.this, MainActivity.class)); 
      this.activity.finish(); 
     } 
    } 
} 

1- Всегда на первом работает (после установки), я получил пустой экран в течение 10 секунд (я предполагаю, что это скрипт работает ...), и после того, как мое приложение переходит к mainActivity.

2- Если я запустил приложение во второй раз, он отображает пустой экран в течение 1 секунды и переходит к MainActivity (даже не отображает компоновку SplashScreen). Кажется, что рабочий класс не работает за пределами нити ui ... Что я должен сделать, чтобы это сделать? Я уже пробовал поставить этого работника на Службу, но все тот же.

+1

В onResume() вы используете 'SetupDataBaseWorker(). Execute();' и не этот 'new SetupDataBaseWorker (this) .execute();' и это не называется 'db_sql = new SqliteManager (this.activity), или я ошибаюсь? – michoprogrammer

+0

'showDialogLoading' работает этот метод и фактически показывает диалог загрузки? – njzk2

+0

Ребята, это * абстракция * ... Весь код работает – PMateus

ответ

2

Если вы делаете все, что в фоновом потоке тогда основной поток вообще не заблокирован.

Я также делаю то же самое «копирование базы данных из папки с данными в базу данных» в операции Splash. Я не получаю ничего подобного вам.

Это проблема с IDE, для студии Android требуется больше времени, чем Eclipse для установки приложения на устройство.

Вы просто попробуйте один раз «Скопируйте APK на устройство и установите его с самого устройства».

Я также принимал то же, что и вы. но проблема связана с «IDE», не связанной с нашим кодом или Android.

+0

Перферкт ... Ты прав. Я сделал это и вуаля, сделал это :). – PMateus

1

Я думаю, что проблема здесь:

public SetupDataBaseWorker(Activity activity) { 
    this.activity = activity; 
    db_sql = new SqliteManager(this.activity); 
} 

движение инициализатор в

public SetupDataBaseWorker(Activity activity) { 
    this.activity = activity;  
} 

@Override 
protected Void doInBackground(Void...urls) { 
    ... 
    db_sql = new SqliteManager(this.activity); 
    db_sql.inserting(); 
    ... 
    return null; 
} 
+1

@MachoProgrammer, славный аватар cat;) – Vyacheslav

+0

: DI нашел его в чудесной сети: D – michoprogrammer

+0

Выполнение этого сценария ускорилось ... – PMateus