The update of the suggestions popup of an AutoCompleteTextField is said to 
be completely asynchronous. 
However, looking at the code of the AutoCompleteTextField class, it looks 
like the filtering and creation of the model for the popup is called on the 
EDT thread directly. 
The only thing I see is a call to  Display.getInstance().callSerially(new 
Runnable() { but as far as I  understand it, this do not create a thread in 
parallel to the EDT but only postpone the operations in this runnable to 
the next EDT cycle
So my question is: if I have a filtering process to create the popup that 
might be long (because the server takes some time to answer or the 
post-filtering of the server answer is complex), should I encapsulate that 
filtering into an invokeAndBlock call?
For example if I have:

final DefaultListModel<String> options = new DefaultListModel<>();
AutoCompleteTextField atf = new AutoCompleteTextField(options) {
            @Override
            protected boolean filter(String text) {
                if(text.length() == 0) {
                    return false;
                }
                String[] l = getSuggestions(text); 
                if(l == null || l.length == 0) {
                    return false;
                }

                options.removeAll();
                for(String s : l) {
                    options.addItem(s);
                }
                return true;
            }
        };


and getSuggestions(text) can potentially take a while, should I wrote:

final DefaultListModel<String> options = new DefaultListModel<>();
AutoCompleteTextField atf = new AutoCompleteTextField(options) {
    @Override
    protected boolean filter(String text) {
        if(text.length() == 0) {
            return false;
        }
    
        Display.getInstance().invokeAndBlock(new Runnable() {
                public void run() { 
                        String[] l = getSuggestions(text); 
                                
                        options.removeAll();
                        if(l != null && l.length > 0) {
                                for(String s : l) {
                                        options.addItem(s);
                                }
                        }
            } 
        });

        if(options.getSize()==0){
                return false;
        }
        return true;                            
    }
};

 
to be sure not to block the EDT?

-- 
You received this message because you are subscribed to the Google Groups 
"CodenameOne Discussions" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to codenameone-discussions+unsubscr...@googlegroups.com.
Visit this group at https://groups.google.com/group/codenameone-discussions.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/codenameone-discussions/a6c06f05-b26b-4dbe-9c7b-fd2725d6c0b2%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to