Android - 按钮图标在函数调用之后而不是之前加载

时间:2016-06-10 16:20:01

标签: android

我有这段代码:

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方法(我认为),但在执行该函数之前图像是否应该更改?

2 个答案:

答案 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;
    }
});

有关AsyncTasks here的详情,您可以查看tutorial

答案 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