0

我想要做的是运行一个方法,该方法将在 ToggleButton 处于打开状态时从我的资产中播放随机声音。然后在 ToggleButton 关闭时停止这样做。问题是,按照目前的构造,我的代码锁定了 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 中。

一个建议:与其将 AsyncTask 放在 while 循环中,为什​​么不做相反的事情并在 AsycTask 中使用 while 循环呢?就像是...

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 回答