对于音乐应用程序(音序器),我有几个按钮
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)
我不知道如何摆脱这个错误。显然,即使列表是静态的,Asynctask也没有找到Buttonlist激活状态。我不知道如何访问这些按钮的状态,isPressed也不起作用。
感谢阅读和帮助我!
答案 0 :(得分:1)
要从ButtonList
访问AsyncTask
,您必须通过传递到AsyncTask
的参数名称来引用它,在本例中为params
。使用AsyncTask
时,传入的参数始终是Array
中指定类型的<....>
,并且访问它(如果只传递一个数组列表)就像此...
ArrayList<Button> Buttonlist = params[0];
然后,您可以从AsyncTask
访问它。虽然我建议给它一个不同的名字,但是有任何冲突。
为了澄清,您可以将任意数量的对象传递到AsyncTask
,逗号分隔,并且系统负责将它们打包成一个数组,并将其传递给AsyncTask
。在你的情况下,你只传入一个数组列表,所以异步任务被传递给一个只有一个对象的数组。所以你会看到params数组的第一个空格,因此params[0]
这有点令人困惑,但这是因为系统正在为您管理一个线程池,并且隐藏了很多实现。