Не удается получить доступ к ресурсам в другом потоке на Android (сбой) - PullRequest
1 голос
/ 19 августа 2011

Это сводило меня с ума в течение нескольких дней, я новичок в 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);
    }
}

Приложение падает при startButton.setChecked(false) в BoomTimeTask.run(), я предполагаю NullPointerException.

Пожалуйста, помогите, я сойду с ума, я попробовал все!Ничего не работает .. Попробовал без контекста, переданного в качестве параметра, так как ссылка должна быть видимой даже для потока BoomTimeTask, пробовал еще дюжину других вещей, просто не могу заставить его работать.

Что мне не хватает?Спасибо заранее, буду очень признателен за любую помощь.Cheers, Val.

решено: как динамически изменять текст кнопки каждые 3 секунды в Android?

1 Ответ

3 голосов
/ 19 августа 2011

Вы должны использовать

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

Это потому, что в Android вы не можете изменять элементы GUI, не будучи в потоке, который имеет дело с GUI.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...