2013-10-08 3 views
0

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

Я установил прослушиватель onClick для запуска цикла, который воспроизводит каждый из этих звуковых файлов снова и снова, их можно воспроизводить более 100 раз.

НО

Мне нужно, чтобы пользователь мог взаимодействовать с приложением в то время как он играет, что он не может в данный момент времени, прогоны цикл и в основном устройство замораживается до тех пор, музыкальные файлы не закончили игру ,

Любые указания по полезному решению?

Loop в основном:

mPlayButton.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public synchronized void onClick(View v) { 

      for(char i: method.toCharArray()){ 
       mPlayer.play(getActivity(),Integer.parseInt(Character.toString(i))); 
       try { 
        wait(500); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

      } 

     } 
    }); 
+0

Рекомендация службы, размещенная ниже, является разумной, но это звучит для меня, как будто у вас есть большая проблема. Служба по умолчанию будет работать в одном потоке, поэтому, скорее всего, вам не поможет, пока вы не очистите все. Можете ли вы опубликовать цикл while? – Dave

+0

Отредактировано desc –

ответ

2

Вы можете сделать это с помощью службы для воспроизведения музыки в фоновом режиме.

Вот отличный учебник о том, как это сделать: LINK.

Что-то вроде this:

Start это, когда вы хотите, чтобы играть музыку:

Intent svc=new Intent(this, BackgroundSoundService.class); 
startService(svc); 

и создать новый файл сервиса в вашем проекте:

public class BackgroundSoundService extends Service { 
    private static final String TAG = null; 
    MediaPlayer player; 
    public IBinder onBind(Intent arg0) { 

     return null; 
    } 
@Override 
public void onCreate() { 
    super.onCreate(); 
    player = MediaPlayer.create(this, R.raw.idil); 
    player.setLooping(true); // Set looping 
    player.setVolume(100,100); 

} 
public int onStartCommand(Intent intent, int flags, int startId) { 
    player.start(); 
    return 1; 
} 

public void onStart(Intent intent, int startId) { 
    // TO DO 
} 
public IBinder onUnBind(Intent arg0) { 
    // TO DO Auto-generated method 
    return null; 
} 

public void onStop() { 

} 
public void onPause() { 

} 
@Override 
public void onDestroy() { 
    player.stop(); 
    player.release(); 
} 

@Override 
public void onLowMemory() { 

} 
} 
1

Я могу только догадываться , потому что вы не приложили код к своему вопросу, но похоже, что вы реализовали цикл, который работает в потоке пользовательского интерфейса, основной поток вашего приложения. Приложение кажется замороженным, потому что один поток может выполнять только одну строку кода за раз и не может выполнять код параллельно. Вам нужно создать другой поток, на котором выполняется цикл для воспроизведения музыки. Существуют разные способы достижения этого. Я думаю, вы должны попытаться реализовать Сервис. Служба предоставляет вам возможность запускать код в другом потоке, а также вы можете легко обмениваться данными с сервисом, например. для запуска или остановки воспроизведения музыки. Для получения дополнительной информации об услугах смотрите: http://developer.android.com/reference/android/app/Service.html Вы также можете использовать google для учебных пособий по обслуживанию android, в Интернете есть много. Удачи!

+0

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

1

Во-первых, спящий режим не позволяет контролировать время здесь, потому что у MediaPlayer есть onCompletionListener, который вы можете установить. Он также имеет метод setNextMediaPlayer, если вы внимательно относитесь к использованию ресурсов (вы не можете просто создать кучу MediaPlayers и подготовить их все).

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

Последнее, что вы, возможно, захотите изучить в SoundPool.