0

私がやりたいことは、ToggleButton がオンのときにアセットからランダムなサウンドを再生するメソッドを実行することです。そして、ToggleButton が Off のときにそれをやめます。問題は、現在構築されているように、私のコードが UI スレッドでロックアップすることです。私は AsyncTask を正しく使用していると思っていましたが、どうやらそうではないようです。

これに対する修正、または私が望むことを達成するためのより良い方法を提案できますか?

    public void onToggleClicked(View view) {
    // Is the toggle on?
    boolean on = ((ToggleButton) view).isChecked();



    while (on) {

        AssetManager assetMgr = this.getAssets();
        try {
            String[] filename = assetMgr.list("sounds");
            Random r = new Random();
            String fn = filename[r.nextInt(filename.length)];
            if (MyService.mp.isPlaying()) {

            }
            else {

                new PlayShuffleMode().execute(fn);

        }


        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

AsyncTask メソッドは次のとおりです。

private class PlayShuffleMode extends AsyncTask<String, Void, Void> {

    @Override
    protected Void doInBackground(String... fn) {

        mService.playfav(fn[0]);
        return null;
    }
}
4

1 に答える 1

1

問題はあなたのwhileループです。whileボタンを切り替えるまでループはメイン スレッドで継続的にループしますが、ループwhileはメイン スレッド上にあるため、UI がロックされます。したがって、whileループを AsyncTask に移動する方法を見つけなければなりません。

1 つの提案: AsyncTask を while ループ内に配置する代わりに、逆の処理を行い、while ループを AsycTask 内に配置してみませんか? 何かのようなもの...

private playShuffle;

public void onToggleClicked(View view) {
  ToggleButton tb = ((ToggleButton) view);
  tb.setChecked(!tb.isChecked()); // Toggle the state.

  if(tb.isChecked()) {
    playShuffle = new PlayShuffleMode();
    playShuffle.execute();
  }
  else {
    playShuffle.cancel();
  }
}
于 2012-11-30T16:45:11.417 に答える