2011-08-18 83 views
1

这一直让我疯狂几天,我是新来的android,我似乎无法弄清楚如何访问其他线程的资源。我试图安排一段时间后执行任务,这里是有关的代码:无法访问Android上的另一个线程资源(崩溃)

公共类TikTakBoom延伸活动{

private SensorManager mSensorManager; 

public ToggleButton startButton; 

private Bitmap mBombOn; 
private Bitmap mBombOff; 

/** Tik tak boom **/ 
protected MediaPlayer mediaPlayer;  // play tik tak or boom 
protected Timer boomTimer;    // timer for explosion 

// bomb button backgrounds 
protected android.graphics.drawable.BitmapDrawable buttonBombOn; 
protected android.graphics.drawable.BitmapDrawable buttonBombOff; 

// random boom delay in ms 
protected long boomDelay = 1500; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    requestWindowFeature(Window.FEATURE_NO_TITLE); 

    // tell system to use the layout defined in our XML file 
    setContentView(R.layout.main); 

    Log.w(this.getClass().getName(), "SIS is null"); 

    // configure toggle button (bomb on/off) 
    startButton = (ToggleButton)findViewById(R.id.toggleButton1); 
    startButton.setText(""); 
    startButton.setTextOn(""); 
    startButton.setTextOff(""); 

    // scale bomb images to button size 
    mBombOff = BitmapFactory.decodeResource(this.getResources(), R.drawable.bomb_off); 
    mBombOff = Bitmap.createScaledBitmap(mBombOff, 120, 120, true); 

    mBombOn = BitmapFactory.decodeResource(this.getResources(), R.drawable.bomb_on); 
    mBombOn = Bitmap.createScaledBitmap(mBombOn, 120, 120, true); 

    buttonBombOn = new android.graphics.drawable.BitmapDrawable(mBombOn); 
    buttonBombOff = new android.graphics.drawable.BitmapDrawable(mBombOff); 

    startButton.setChecked(false); 

    boomTimer = new Timer(); 

    // onclick listener for toggle bomb on/off 
    startButton.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      // Perform action on clicks 
      if (startButton.isChecked()) { 
       mediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.tik_tak); 

       mediaPlayer.setLooping(true); 
       mediaPlayer.start(); 

       // align boom delay with tik tak duration 
       boomDelay -= boomDelay%mediaPlayer.getDuration(); 

       boomTimer.schedule(new BoomTimeTask(getApplicationContext()), boomDelay); 

       startButton.setBackgroundDrawable(buttonBombOn); 
      } else { 
       if (mediaPlayer != null) { 
        mediaPlayer.release(); 
        mediaPlayer = null; 
       } 

       startButton.setBackgroundDrawable(buttonBombOff); 
      } 
     } 

    }); 
} 

class BoomTimeTask extends TimerTask { 
    Context context; 

    public BoomTimeTask(Context context) { 
     super(); 

     this.context = context; 
    } 

    public void run() { 
     if (mediaPlayer != null) { 
      mediaPlayer.release(); 
      mediaPlayer = null; 
     } 

     mediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.sheldon); 

     mediaPlayer.setLooping(false); 
     mediaPlayer.start(); 

     startButton = (ToggleButton)((Activity)context).findViewById(R.id.toggleButton1); 

     startButton.setChecked(false); 
     //startButton.setBackgroundDrawable(buttonBombOff); 
    } 
} 

应用在BoomTimeTask.run()startButton.setChecked(false)崩溃,我猜测空指针异常。

请帮助,我要去疯了,我已经尝试了一切!没有任何作品..尝试它没有作为参数传递的上下文,因为参考应该可以看到BoomTimeTask线程,尝试了十几个其他的东西,只是无法让它的工作。

我在想什么? Thx提前,真的会很感激任何帮助。干杯,瓦尔。

解决:how to change button text dynamically for every 3 sec in android?

回答

3

您应该使用

runOnUiThread(new Runnable() { 
    public void run() { 
    // YOUR ACTIONS ON Graphic interface 
    } 
}); 

这是因为在Android中你不能修改GUI元素,而在与GUI处理线程之中。

http://developer.android.com/reference/android/app/Activity.html

+0

谢谢您的快速回复!我其实知道,我只是把它当作最后的手段。因为我不想阻碍与UI无关的操作,导致UI性能下降。有没有其他方法?或者,也许我可以拆分这个runnable并在'runOnUiThread(..)'中执行UI操作,并将其从另一个线程中分离出来以执行其他操作?干杯,瓦尔。 – valekovski

+0

当然在RunOnUiThread中,您只需将您的代码与您的GUI相关=) – jDourlens

+0

您也可以使用听众 – jDourlens

相关问题