0

音楽アプリケーション(シーケンサー)の場合、いくつかのボタンがあります

static ArrayList<Button> Buttonlist = new  ArrayList<Button>(); 

    Buttonlist.add(0,(Button) findViewById(R.id.case_kick1));
    Buttonlist.add(1,(Button) findViewById(R.id.case_kick2));
    Buttonlist.add(2,(Button) findViewById(R.id.case_kick3));
    Buttonlist.add(3,(Button) findViewById(R.id.case_kick4));
    Buttonlist.add(4,(Button) findViewById(R.id.case_kick5));
    Buttonlist.add(5,(Button) findViewById(R.id.case_kick6));
    Buttonlist.add(6,(Button) findViewById(R.id.case_kick7));
    Buttonlist.add(7,(Button) findViewById(R.id.case_kick8)); 

たとえば、onClickListenersを介してアクティブ化します

Buttonlist.get(0).setActivated(true);

ループとifsを介してアクティブ化されたサウンドを再生しました:

if (Buttonlist.get(k).isActivated()) {mSoundManager.playSound(1); Thread.sleep(250);}

アプリは正常に再生されましたが、再生中に再生/一時停止ボタンにアクセスできませんでした。AsyncTasksを検索して見つけました。

ネストされたクラスPlayPauseがあります:

class PlayPause extends AsyncTask<ArrayList<Button>,Integer,Void>

私はこれを持っています:

protected Void doInBackground(ArrayList<Button>... params) {

    for(int k=0;k<8;k++)
    {
    boolean isPlayed = false;

    if (Buttonlist.get(k).isActivated()) {
    mSoundManager.playSound(1); 
    isPlayed = true;
    try {Thread.sleep(250);
    } 
    catch (InterruptedException e) 
    {e.printStackTrace();}}

    if(!isPlayed){
    try {Thread.sleep(250);}
    catch (InterruptedException e) 
    {e.printStackTrace();}
    }

   }
 return null;

}

経由で起動します

   Play.setOnClickListener(new PlayClickListener());

PlayClickListenerを使用:

public class PlayClickListener implements OnClickListener {

private Tutorial acti;


public PlayClickListener(){
    super();
    }

    @SuppressWarnings("unchecked")
    public void onClick(View v) {
    if(Tutorial.play==0){
        Tutorial.play=1;
        Tutorial.Play.setBackgroundResource(R.drawable.action_down);
        acti = new Tutorial();
    Tutorial.PlayPause myPlayPause = acti.new PlayPause();
    myPlayPause.execute(Tutorial.Buttonlist);
    }
    else
    {
    Tutorial.play=0;
    Tutorial.myPlayPause.cancel(true);
    Tutorial.Play.setBackgroundResource(R.drawable.action);
    }
}

 }

しかし、それは機能しません。ボタンをクリックして[再生/一時停止]をタッチすると、次のようになります。

07-02 11:06:01.350: E/AndroidRuntime(7883): FATAL EXCEPTION: AsyncTask #1
07-02 11:06:01.350: E/AndroidRuntime(7883): Caused by: java.lang.NullPointerException
07-02 11:06:01.350: E/AndroidRuntime(7883):     at com.Tutorial.Tutorial$PlayPause.doInBackground(Tutorial.java:603)
07-02 11:06:01.350: E/AndroidRuntime(7883):     at com.Tutorial.Tutorial$PlayPause.doInBackground(Tutorial.java:1)

そして、私はこのエラーを取り除く方法がわかりません。明らかに、リストが静的であっても、非同期タスクはボタンリストがアクティブ化されたステータスを検出しません。これらのボタンの状態にアクセスする方法がわかりません。isPressedも機能しません。

読んでくれてありがとう!

4

1 に答える 1

1

ButtonListからにアクセスするにAsyncTaskは、 に渡されるパラメータの名前で参照する必要がありますAsyncTask(この場合は ) params。を使用するAsyncTaskと、渡される params は常に とArrayの間に指定されたタイプの であり、<....>それにアクセスするには (1 つの配列リストのみを渡す場合)、次のようになります...

ArrayList<Button> Buttonlist = params[0];

からアクセスできますAsyncTask。競合がある場合に備えて、別の名前を付けることをお勧めしますが。

明確にするために、必要な数のオブジェクトをAsyncTaskカンマ区切りで に渡すことができ、システムはそれらを に渡す配列にパッケージ化しますAsyncTask。あなたの場合、配列リストを1つだけ渡すので、非同期タスクにはオブジェクトが1つだけの配列が渡されます。したがって、params 配列の最初のスペースを調べることになります。params[0]

これは少し紛らわしいですが、システムがスレッド プールを管理しており、多くの実装が隠されているためです。

于 2012-07-02T11:09:22.477 に答える