【问题标题】:How to use threads in MVC architecture?如何在 MVC 架构中使用线程?
【发布时间】:2017-02-01 14:51:47
【问题描述】:

我的一个实现类的方法需要很长时间才能完成,这让我的视图冻结。所以这些方法必须是线程的!

所有这些方法都返回带有HashMapsLists 的数据。

我的控制器通过调用它们来获取这些数据,然后将它们传递给视图。

我不知道应该在哪里创建线程。 它应该在控制器层还是在实现类中(以及如何因为我在那里有很多方法)。

我还需要仅在线程工作完成时刷新视图。 这些方法将被重新调用。

我真的迷失在我遇到的所有线程技术中。

控制器:

SomeParser someParser = new FirstParserImpl();

HashMap<String,String> map = someParser.parseSomething();
loadTableView(map);

FirstParserImpl:

public HashMap<String,String> parseSomething() {
    //opening http connection, scrape and parse data. This takes long time!
    return map;
}

【问题讨论】:

  • 如果我们没有代码,很难知道如何提供帮助。
  • @MichaelPickett 对不起,我认为我的问题已经足够描述了。请给我一些时间来发布我的一些代码。谢谢
  • 为了您的眼睛,我试图简单地说明我如何调用这些方法。

标签: java multithreading model-view-controller javafx


【解决方案1】:

使用Task。您可以直接在控制器类中执行此操作:

Task<Map<String, String>> parseDataTask = new Task<Map<String, String>>() {

    @Override
    public Map<String, String> call() {
        SomeParser someParser = new FirstParserImpl();
        return someParser.parseSomething();
    }
};

parseDataTask.setOnSucceeded(e -> {
    Map<String,String> parseResults = parseDataTask.getValue();
    // update UI here with parseResults, e.g:
    loadTableView(parseResults);
});

Thread t = new Thread(parseDataTask);
t.setDaemon(true);
t.start();

【讨论】:

    【解决方案2】:

    结合James_D answer + Services(tutorial) 您可以执行以下操作: (基本上一个服务会启动一个线程来完成你想要的工作并返回一个result

    public class WorkerService extends Service<Map<String, String>> {
    
        /**
         * Constructor
         */
        public WorkerService () {
    
            // if succeeded
            setOnSucceeded(s -> {
                //code if Service succeeds
            });
    
            // if failed
            setOnFailed(fail -> {
                //code it Service fails
            });
    
            //if cancelled
            setOnCancelled(cancelled->{
                //code if Service get's cancelled
            });
        }
    
        /**
        * This method starts the Service
        */
        public void startTheService(){
            if(!isRunning()){
               //...
               reset();
               start();
            }
    
        }
    
        @Override
        protected Task<Map<String, String>> createTask() {
            return new Task<Map<String, String>>() {
                @Override
                protected Void call() throws Exception {
    
                        //create a Map<String, String>
                        Map<String,String> map  = new HashMap<>();
    
                       //create other variables here
    
                       try{
                            //some code here
                            //.....do your manipulation here
    
                            updateProgress(++currentProgress, totalProgress);
                        }
    
                    } catch (Exception ex) {                  
                        return null; //something bad happened so you have to do something instead of returning null
                    }
    
                    return map;
                }
            };
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2011-07-17
      • 1970-01-01
      • 2020-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 2021-12-09
      • 1970-01-01
      相关资源
      最近更新 更多