Android:只有创建视图层次结构的原始线程才能接触其视图

Android:只有创建视图层次结构的原始线程才能接触其视图,android,multithreading,text-to-speech,onutterancecompleted,Android,Multithreading,Text To Speech,Onutterancecompleted,当我在下面的代码中调用listenButton.setAlpha((float)1)时,出现错误“android.view.ViewRootImpl$CalledFromErrorThreadException:只有创建视图层次结构的原始线程才能接触其视图”。我理解为什么,但是当我收到onDone事件时,我如何修改按钮 public class MainActivity extends ActionBarActivity implements TextToSpeech.OnInitListene

当我在下面的代码中调用
listenButton.setAlpha((float)1)
时,出现错误“android.view.ViewRootImpl$CalledFromErrorThreadException:只有创建视图层次结构的原始线程才能接触其视图”。我理解为什么,但是当我收到onDone事件时,我如何修改按钮

public class MainActivity extends ActionBarActivity implements TextToSpeech.OnInitListener {
    [...]
    @Override
    // OnInitListener method to receive the TTS engine status
    public void onInit(int status) {
       if (status == TextToSpeech.SUCCESS) {
         ttsOK = true;
         tts.setOnUtteranceProgressListener(new UtteranceProgressListener() {
                @Override
                public void onDone(String utteranceId) {
                    Button listenButton = (Button) findViewById(R.id.listentts);
                    listenButton.setAlpha((float)1);
                    listenButton.setClickable(true);
                }

                @Override
                public void onError(String utteranceId) {
                    Log.d("MainActivity", "Progress on Error " + utteranceId);
                }

                @Override
                public void onStart(String utteranceId) {
                    Log.d("MainActivity", "Progress on Start " + utteranceId);
                }
            });
       }
       else {
         ttsOK = false;
       }
    }
    [...]
}
试试这个:

new Handler(Looper.getMainLooper()).post(new Runnable() {
    @Override
    public void run() {
        Button listenButton = (Button) findViewById(R.id.listentts);
        listenButton.setAlpha((float)1);
        listenButton.setClickable(true);
    }
});

每个
视图
都有一个与之关联的
处理程序
,因此无需创建新的处理程序

final View v = findViewById(R.id.listentts); // could be a class member
v.getHandler().post(new Runnable() {
    @Override
    public void run() {
        v.setAlpha(1.0f);
        v.setClickable(true);
    }
});