2016-09-23 66 views
3

我的一個實現類有一些方法需要很長時間才能完成,這使我的視圖凍結。所以這些方法必須通過線程!如何在MVC體系結構中使用線程?

所有這些方法都返回數據HashMapsLists

我的控制器通過調用它們來獲取數據,然後將它們傳遞給View。

我無法弄清楚的是我應該在哪裏創建線程。 它應該是在控制器層還是在實現類(以及如何如此,因爲我有很多方法)。

此外,我只需要在線程工作完成時刷新視圖。 這些方法將被重新調用。

我真的迷失在我遇到的所有線程技術中。

控制器:

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答案+服務(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; 
      } 
     }; 
    } 

}