2016-08-14 2 views
0

Я собираюсь создать приложение, которое позволит нам получить все песни на SD-карте, а затем перевести список песен в SQLite на службу. В следующем, я хочу, чтобы вся песня была показана на экране активности и отображения прогресса. У меня возникла проблема при запуске: в первый раз он ничего не отображает (просто покажите диалог прогресса навсегда). Но когда я запускаю его снова (второй раз), он работает хорошо.Данные Android не вставлены в базу данных при первом запуске

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mListSongs = new ArrayList<>(); 
    lvSong = (ListView) findViewById(R.id.lv_song); 
    Intent it = new Intent(this, ScanSongService.class); 
    startService(it); 
    mDbHelper = new DBHelper(this); 
    mListSize = mDbHelper.getDBSize(); 
    Log.d(TAG, "-------- mListSize on activity: " + mListSize); 
    new ScanSongAsyncTask(this).execute(); 
} 

Пример из кода выше:
На службе, я загрузил всю песню и добавить к БД. Я зарегистрировался, все в порядке.
В первый раз, mListSize 0.
Во второй раз, mListSize 12 (количество песен на SD-карте).

+0

где вы добавляете данные в базу? –

+1

при запуске службы 'startService (it);' потребуется некоторое время, прежде чем он завершит свою работу, поэтому вызов 'mDbHelper = new DBHelper (this);' не приведет к правильной (или любой) службе cuz данных, все еще запущенной или даже вставляемой еще не началось. вам нужно будет вызвать что-то из службы, когда работа будет завершена. – Yazan

+0

@ExceptionLover: Как я уже говорил по этой теме, я загружаю всю песню (.mp3) с SD-карты –

ответ

0

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

Альтернативно вы можете использовать AsyncTask и вставить его в свой метод doInBackgroung, а затем получить размер (или выполнить любую последующую обработку) в своем методе onPostExecute. Проблема, о которой вы упоминали, что у вас есть индикатор выполнения, может быть решена с помощью AsyncTask тоже (просто отпустите индикатор выполнения в методе onPostExecute).

В случае пользования услугой, как вы сделали здесь, изменить код для вставки данных, как показано ниже:

void insertData(){ 
    //your code for inserting data 
    .... 
    Log.d(TAG, "-------- mListSize on activity: " + mListSize); 
    new ScanSongAsyncTask(this).execute(); 
} 

т.е. переместить начало вашего ScanSongAsyncTask и протоколирование размера Db после вставки данных кодов. Если вам нужно обновить интерфейс, например, обновить listView, используйте для этого runOnUIThread.

+0

@Akaram Shokri : Спасибо за ваш ответ, но это моя задача. Мне нужно вставить данные об услуге. Если я все делаю на работу, это не проблема, сэр :) –

+0

@Brascelok Wel, я предложил использовать AsyncTask, и, используя его, вы все равно избегали работы в этой работе. Кроме того, вы можете использовать AsyncTask и в своем сервисе, хотя это не подходит для вашего дела. Однако, если вам нужно использовать сервис, вы можете и вы на самом деле это сделали. Я обновил свой ответ, чтобы показать, как это сделать на службе. – Merka

+0

Действительно ли метод insertData() в службе прав? Я прочитал несколько статей, которые рекомендуют нам не вызывать асинхронную задачу на службе, как вы сказали. Я попробую с новым решением, которое создаст новую кнопку в действии, а затем обработает задачу async при событии кнопки –

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