0

私はギリシャ語で .mp3 の単語を聞くためのアプリを作成しているので、メディアプレーヤーがあり、1000 ミリ秒後に .mp3 ファイルに応じて次の単語が表示されるはずなので、再生、一時停止、停止の 3 つの機能があります。スレッドを一時停止してから続行する必要があります。それが終わるとき。私のスレッドでは、notify を呼び出して一時停止メソッドが機能していません。notify() を呼び出す前にオブジェクトをロックする方法がわかりません。これが私のコードです。

   class MyinnerThread implements Runnable  {
    String name;
    Thread tr;
    boolean suspendFlag;
    int i = 0;

    MyinnerThread(String threadname) {
        name = threadname;
        tr = new Thread(this, name);
        suspendFlag = false;
        tr.start();
    }

    public void run() {
        try {

            runOnUiThread(new Runnable() {
                @Override
                public void run() {

                    if(i == 0){tv1.setText("trhead1");}
                    if(i == 1){tv2.setText("trhead2");}
                    if(i == 2){tv3.setText("trhead3");}
                    if(i == 3){tv4.setText("trhead4");}
                    if(i == 4){tv5.setText("trhead5");}
                    if(i == 5){tv6.setText("trhead6");}
                    if(i == 6){tv7.setText("trhead7");}
                    if(i == 7){tv8.setText("trhead8");}

                    try {
                        Thread.sleep(800);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized(this) {
                        while(suspendFlag) {
                            try {
                                tr.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                    i++;
                }
            });
            Thread.sleep(200);

        } catch (InterruptedException e) {
            System.out.println(name + " interrupted.");
        }
    }
    void mysuspend() {
        suspendFlag = true;
    }

    synchronized void myresume() {
        suspendFlag = false;
        tr.notify();
}

}

 @Override
public void onClick(View v) {
    switch(v.getId()){
        case R.id.play:
            if(mp.isPlaying()){
                mp.pause();
                play.setBackgroundResource(R.drawable.play);

                t.mysuspend();

                Toast.makeText(getApplicationContext(), "Pause", Toast.LENGTH_SHORT).show();
            }
            else if(!mp.isPlaying()){
                mp.start();

                if(runningThread){
                    t.myresume();
                }

                if(!runningThread){
                    runningThread = true;

                    t = new MyinnerThread("name");

                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                Toast.makeText(getApplicationContext(), "Play", Toast.LENGTH_SHORT).show();
                play.setBackgroundResource(R.drawable.pause);
            }
            break;

        case R.id.stop:
            Toast.makeText(getApplicationContext(), "Stop", Toast.LENGTH_SHORT).show();
            mp.release();

            Thread.currentThread().interrupt();
            t = null;

            runningThread = false;

            setPlayer();
            play.setBackgroundResource(R.drawable.play);
            break;
    }
}
4

0 に答える 0