2016-09-23 2 views
3

私の実装クラスの1つには、完了までにかなりの時間がかかるメソッドがあり、それが私のビューをフリーズさせます。したがって、これらのメソッドはスレッド化されていなければなりません!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を使用してください。あなたは、コントローラクラスで直接これを行うことができます:

あなたは以下を行うことができます James_D答え+サービス( tutorial)を組み合わせること
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

を: (基本的サービスは、あなたがをしたい仕事と復帰を行いますスレッドを開始します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; 
      } 
     }; 
    } 

} 
関連する問題