2016-09-23 6 views
3

Один из моих классов реализации имеет методы, которые занимают довольно много времени, и это заставляет меня замораживать. Поэтому эти методы должны быть пронизаны резьбой!Как использовать потоки в архитектуре MVC?

Все эти методы возвращают данные с HashMaps или Lists.

Мой контроллер получает эти данные, вызывая их, а затем передает их в Вид.

Что я не могу понять, где я должен создать поток. Должно ли это быть на уровне контроллера или в классе реализации (и как это сделать, так как у меня есть много методов).

Также мне нужно обновить представление только после завершения работы нити. Эти методы будут повторно вызваны.

Я действительно потерялся во всех тех методах нарезки, с которыми столкнулся.

Контроллер:

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; 
} 
+0

Его трудно узнать, как помочь, если у нас нет кода. –

+0

@MichaelPickett Извините, я думал, что мой вопрос будет достаточно описательным. Пожалуйста, дайте мне некоторое время, чтобы опубликовать часть моего кода. Спасибо – pror21

+0

Я старался быть простым в том, как я называю эти методы ради ваших глаз. – pror21

ответ

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(); 
1

Объединяя James_D ответа + Services (tutorial) вы можете сделать ниже: (В основном служба начинает тему, которая будет делать работу, которую вы хотите и возврат a 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; 
      } 
     }; 
    } 

} 
Смежные вопросы