我有这段代码:
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!clicked){
clicked = true;
fab.setImageResource(R.drawable.ic_media_stop);
char[] userInput = et.getText().toString().toLowerCase().toCharArray();
compareToMap(userInput);
}else{
clicked = false;
fab.setImageResource(R.drawable.ic_media_play);
}
}
});
单击浮动操作按钮时,我希望它更改为停止符号,然后执行该功能。发生的事情是在按钮上的图像发生变化之前执行代码。只有在compareToMap
函数执行完所有代码后,图像才会更改,即使它在代码中位于代码之前。有没有办法确保在compareToMap
函数执行之前图像发生变化?
注意:compareToMap
函数包含导致UI阻塞的Thread.sleep
方法(我认为),但在执行该函数之前图像是否应该更改?
答案 0 :(得分:0)
您可以使用AsyncTask执行compareToMap(userInput)方法,这将在一个单独的线程中运行compareToMap方法,并且不会阻止UI;像这样的东西:
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
fab.setImageResource(!clicked ? R.drawable.ic_media_stop : R.drawable.ic_media_play);
if (!clicked) {
// Cancel the executing AsyncTask if there's one already running
if (mAsyncTask != null) {
mAsyncTask.cancel(true);
}
mAsyncTask = new AsyncTask<String, Void, Void>() {
@Override
protected Void doInBackground(String... params) {
compareToMap(userInput);
return null;
}
};
mAsyncTask.execute();
}
clicked != clicked;
}
});
答案 1 :(得分:0)
此时UI尚未加载。如果你想在加载UI后做一些工作,你可以使用类Handler。
long postDelay = 100; //The delay (in milliseconds) until the Runnable will be executed
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
//Code that you want to execute after the UI is loaded
compareToMap(userInput);
}
}, postDelay);
注意:您不能在UI主线程上使用Thread.sleep。你可以在这里了解更多。 https://developer.android.com/guide/components/processes-and-threads.html。