0

私はメディアプレーヤーを作成しており、進行状況バーがあります。再生ボタンをクリックすると、進行状況バーの進行状況を設定するスレッドが開始されます。一時停止ボタンをクリックすると、スレッドが停止します。

しかし、停止ボタンを押すと、進行状況バーがロールバックされ、再生がクリックされたときに再び開始したいので、スレッドを破棄したいのですが、それができません。停止ボタンが押されたときに suspend() メソッドを呼び出すと、次のようになります:-

 03-24 13:17:27.855: ERROR/global(26971): java.lang.UnsupportedOperationException

これが非推奨の方法であることは知っていますが、停止ボタンが押されたときにスレッドを破棄する方法を教えてください。以下は私のコードの一部です:-


 public void onClick(View src) {
        switch (src.getId()) {
        case R.id.buttonStart:
            if(DataManager.getInstance().getSongPause()=="y"){
                myService.player.start();
                DataManager.getInstance().setSongPause("n");
                buttonStart.setVisibility(View.GONE);
                buttonPause.setVisibility(View.VISIBLE);
            //  DataManager.getInstance().setWantsToPlaySong(true);
                //DataManager.getInstance().setOnPausedSong("n");
                //DataManager.getInstance().setOnPausedSong("y");
                if(mt.paused==true){
                    mt.unPauseProgressBar();

                }
            }else{
        stopService(new Intent(this, MyService.class));
            DataManager.getInstance().setSong_uri(uri); 
            Intent intent = new Intent(this,MyService.class);
            Bundle b = new Bundle();
            b.putString("song_uri",uri );
            intent.putExtras(b);
            startService(intent);
            buttonStart.setVisibility(View.GONE);
            buttonPause.setVisibility(View.VISIBLE);
            DataManager.getInstance().setOnPausedSong("y");
            DataManager.getInstance().setPausedSongName(songName);
            //Toast.makeText(this, "My Service Started "+DataManager.getInstance().getSongDuration(), Toast.LENGTH_LONG).show();
            //new Thread(myThread).start();
            }
            //Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
            break;
        case R.id.buttonStop:
          Log.d(TAG, "onClick: stopping srvice");
          stopService(new Intent(this, MyService.class));
          buttonStart.setVisibility(View.VISIBLE);
            buttonPause.setVisibility(View.GONE);
            /*mt=null;
            seekbar.setProgress(0);*/
            mt.stopProgressBar();

            //mt.destroy();

            //mt.notify();


     break;
        case R.id.buttonforward:

             stopService(new Intent(this, MyService.class));
             current_song++;
            FetchAllMusic fetchAllMusic = new FetchAllMusic();
            fetchAllMusic.execute();
            //new Thread(myThread).start();


                break;
        case R.id.buttonbackward:
              Log.d(TAG, "onClick: stopping service");
              stopService(new Intent(this, MyService.class));
              if(current_song>0){   
              current_song--;
               }
                FetchAllMusic fetchAllMusic2 = new FetchAllMusic();
                fetchAllMusic2.execute();

              break;
        case R.id.buttonPause:
              buttonStart.setVisibility(View.VISIBLE);
                buttonPause.setVisibility(View.GONE);
            /* MyService myservice=new MyService();
             myservice.onPause();*/
                myService.player.pause();
            //  myThread.
                DataManager.getInstance().setSongPause("y");
                DataManager.getInstance().setWantsToPlaySong(false);
                DataManager.getInstance().setOnPausedSong("n");
                DataManager.getInstance().setPausedSongName(songName);

                mt.pauseProgressBar();

            /*try {
                //Thread.sleep(10000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }*/

そして以下は私のスレッドクラスです:-

class myThread extends Thread implement Runnable{
            // long duration=DataManager.getInstance().getSong_duration();
        //長い値=期間/100;
          プライベート volatile ブール値一時停止 = false;
            プライベート揮発性ブール終了 = false;

                    @オーバーライド
                    public void run()

                    {

                        while(!終了){
                    while (myProgress

進行状況バーを停止すると、上記のエラーが表示されます

4

1 に答える 1

0

スレッド停止のサスペンドまたは破棄メソッドを使用できません...停止ボタンが押されたとき..
これを使用してスレッドを停止する方法

このコードを確認してください...そして、スレッドがメインループ内でフラグをチェックするように、これがフラグを持つ最も安全な方法です。

class ScanningThread extends Thread {
    // Must be volatile:
    private volatile boolean stop = false;

    public void run() {
            while (!stop) {
                    System.out.println("alive");
            }
            if (stop)
                    System.out.println("Detected stop");
    }

    public synchronized void requestStop() {
            stop = true;
    }
}
public synchronized void startThread(){
    if(runner == null){
            android.util.Log.v("@@@@@@@@@@@@@@@@@@@@", "DoScan.startthread");         
            runner = new ScanningThread();
            runner.start();
    }
}
public synchronized void stopThread(){
    if(runner != null){
            android.util.Log.v("@@@@@@@@@@@@@@@@@@@@", "DoScan.stopthread");
            runner.requestStop();
            runner = null;
    }

}

お役に立てれば..

于 2011-03-24T08:03:53.560 に答える