Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Операционные системы > Мобильные ОС (Android, iOS, Windows Phone)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.07.2013, 01:50   #11
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Перепробовал уже десятки вариантов, прихожу к выводу, что при вызове сервиса из onCreate или onResume приложение останавливается из-за того, что обращение к Сети идёт из потока UI, что блокирует его с вытекающими. Попытка перенести в отдельный тред или в метод onServiceConnected помогает, но через довольно быстрое время (15-50 сек) звук останавливается.
Код:
Все работает, и не понятно что куда и зачем вы перенесли.
Сначала была кнопка PLAY/PAUSE на экране, по ней и запускался MP3 из Сети. А мне нужно, чтобы загружалось не по клику, а по загрузке этой Activity. Так вот и пытаюсь очень долго это сделать.

Код:
public class PlayerActivity extends Activity {

    private int num;
    private String url;
    
    
    public PlayerService mp3Service;
    
   
    
    private ServiceConnection mp3PlayerServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName arg0, IBinder binder) {
            mp3Service = ((LocalBinder) binder).getService();
 
            //Thread t = new Thread() {
            //    public void run() {
// ТУТ ЗАПУСК СЕРВИСА С ПОЛУЧЕННЫМ URL - возможно, в новом треде 

                    mp3Service.playSong(getApplicationContext(),url);

//                }
//            };
//          t.start();
            
            
        }
 
        @Override
        public void onServiceDisconnected(ComponentName arg0) {
 
        }
     };
     
     @Override
     public void onCreate(Bundle savedInstanceState) {
     
    	 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
         super.onCreate(savedInstanceState);
         setContentView(R.layout.player_activity); 
    	 
        
         // GETTING URL, XML ////////////////////////////////////////////////////////////////////////
     
         // END GETTING URL, XML
         
         // SERVICE LAUNCH
         
         
         play_button.setImageResource(states[1]);
        
         startService(new Intent(this, PlayerService.class));
         Intent connectionIntent = new Intent(this, PlayerService.class);
         bindService(connectionIntent, mp3PlayerServiceConnection, Context.BIND_AUTO_CREATE);
         
     }
	
	
	
		
	
	
	
}
СЕРВИС:
Код:
public class PlayerService extends Service {

	public final IBinder localBinder = new LocalBinder();
    private MediaPlayer mplayer;
    
    public String currenturl;
    public boolean on=false;
    
    public PlayerService() {
    	this.currenturl="";
    	this.on=false;
    	
    }
    
    @Override
    public IBinder onBind(Intent intent) {
        return localBinder;
    }
 
    @Override
    public void onCreate() {
 
    }
 
    public class LocalBinder extends Binder {
        PlayerService getService() {
            return PlayerService.this;
        }
    }
 
    public void onPrepared(MediaPlayer player) {
        player.start();
    }
    
    public void playSong(Context c, String url) {
    	 if (this.currenturl.equals(""))
         {
    	
    		

             this.mplayer = MediaPlayer.create(c, Uri.parse(url));
             this.currenturl=url;
             this.mplayer.start();
         }
         else
         	{
         	if (!this.currenturl.equals(url))
         	{
         		this.mplayer.stop();
         		//this.mplayer=null;
         	   this.mplayer = MediaPlayer.create(c, Uri.parse(url));
               this.mplayer.start();
               this.currenturl=url;
               
                      		
         	} else
         	{
         		if (this.on==false)
         		this.mplayer.start();
         		
         	};
         	
         	};
         this.on=true;
    }
 
    public void pauseSong(Context c) {
        this.mplayer.pause();
        this.on=false;
    }
 
    //
    public void stopSong(Context c) {
        this.mplayer.stop();
    }
    
    public boolean isPlaying(Context c) {
        return this.mplayer.isPlaying();
    }
    
    public void setUrl (String url)
    {
    this.currenturl=url;	
    }
    
    public void setplayed (boolean played)
    {
    this.on=played;	
    }
    
    public void showError ()
    {
    Toast.makeText(getApplicationContext(), "Ошибка подключения", Toast.LENGTH_LONG).show();	
    
    }
    
}
Не стабильно это работает, случаются остановки воспроизведения. playSong можно вызывать в новом треде (закомментировано). Видимо, так нужно.

Последний раз редактировалось motorway; 11.07.2013 в 01:59.
motorway вне форума Ответить с цитированием
Старый 11.07.2013, 05:20   #12
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

1. Activity:
Код:
startService(new Intent(this, PlayerService.class));
не нужен
2. Activity: Где unbind?
3. Service: MediaPlayer, создали. Где prepare? Где setDataSource()? Зачем я вам давал ссылку на developer.android.com ?
BOBAH13 вне форума Ответить с цитированием
Старый 11.07.2013, 10:56   #13
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

1. Почему не нужен? - это как раз с того сайта.
2.. Ещё не сделал.
3. Create с этими параметрами и url может заменить соответствующие вызовы.
developer.android.com я изучаю с начала всей работы.

Последний раз редактировалось motorway; 11.07.2013 в 10:58.
motorway вне форума Ответить с цитированием
Старый 11.07.2013, 21:49   #14
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от motorway Посмотреть сообщение
1. Почему не нужен? - это как раз с того сайта.
2.. Ещё не сделал.
3. Create с этими параметрами и url может заменить соответствующие вызовы.
developer.android.com я изучаю с начала всей работы.
1. Потому что
Код:
bindService(connectionIntent, mp3PlayerServiceConnection, Context.BIND_AUTO_CREATE);
2. Нужно сделать
3. Согласен
4.
Код:
public void playSong(Context c, String url)
поменять на
Код:
public void playSong(String url)
т.к. посылать context через IPC не стоит, да он вам и не нужен, т.к. ваш же Service и есть Context.
BOBAH13 вне форума Ответить с цитированием
Старый 12.07.2013, 01:16   #15
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Сам код как вы можете оценить? Явных причин для нестабильной работы нет?
Один или несколько раз появлялись сразу 2 или 3 потока с разными URL, звучащие одновременно. Т.е., основной поток продолжал звучать, а новый URL открывался не в нём, а в новом.

Поток прерывается, кстати, и в браузере, так что причина прерывания, видимо, не в коде.

Последний раз редактировалось motorway; 12.07.2013 в 01:18.
motorway вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Альтернатива TJpegImage / ошибка Error creating device context Puhovoi Общие вопросы Delphi 1 29.03.2013 11:47
GetDC TThread Synchronize - error creating window device context ZBEP Общие вопросы Delphi 2 28.08.2012 23:50
create a number Alexander1205 Общие вопросы C/C++ 1 22.01.2011 00:58
Отображение картинки на кнопке WPF. Загрузка картинки из ресурсов. Проблема с Uri. Casper-SC Общие вопросы .NET 0 27.06.2010 23:11
Метод Create Skyline174Rus Помощь студентам 7 11.02.2010 15:11