2013-07-11 41 views
5

Tôi đang cố gắng tạo lại cùng một logic mà AsyncTask của Android tuân theo mã thuần Java.Cách tạo lại AsyncTask từ Android trong mã Java thuần túy

Để thực hiện điều đó, tôi đã tạo lớp trừu tượng AsyncTask triển khai IAsynTask của tôi về cơ bản gọi onPreExecute, doInBackground và onPostExecute, tôi cũng đã tạo phương thức thực thi nơi phép thuật xảy ra. Vì vậy, để sử dụng điều đó trong quá trình đăng nhập của tôi, ví dụ, tôi đã tạo lớp LoginTask mở rộng AsyncTask, nhưng không giống như tôi đã tưởng tượng việc triển khai onPreExecute, doInBackground và onPostExecute không phải là bắt buộc. Tôi đang làm gì sai?

inteface:

public interface IAsyncTask { 

    public void onPreExecute(); 
    public void doInBackground(); 
    public void onPostExecute(); 

} 

Class:

public abstract class AsyncTask implements IAsyncTask{ 

    public void onPreExecute() { 

    } 

    public void doInBackground(){ 

    } 

    public void onPostExecute() { 

    } 

    public void execute() { 

     onPreExecute(); 

     new Thread(new Runnable() { 
      @Override 
      public void run() { 

       doInBackground(); 

       Platform.runLater(new Runnable() { 
        @Override 
        public void run() { 
         onPostExecute(); 
        } 
       }); 
      } 
     }).start(); 
    } 
} 

[EDITED]

Với câu hỏi của tôi về JavaFX tôi đã nhận thấy rằng nhiều nhà phát triển mới đang phải đối mặt vấn đề quản lý Chủ đề. Tôi muốn chia sẻ những gì tôi đã làm để đơn giản hóa cuộc sống của tôi về quản lý các chủ đề trên javafx. Tôi đã tạo ra một lớp AsyncTask dựa trên AsyncTask từ Android mà về cơ bản làm giống như của Android một cách khiêm tốn nhưng hiệu quả. Bạn có thể tìm thêm thông tin về nó trên Github project

+2

Tại sao không thấy nguồn Android? – azizbekian

+0

Android là nguồn mở, bạn chỉ có thể truy cập và sao chép mã ... – Karakuri

+2

Đây là: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/ 4.2.2_r1/android/os/AsyncTask.java/ –

Trả lời

2

Tôi xin lỗi nếu tôi không thể giải thích chính xác tôi muốn gì, nhưng sau khi bạn thấy mã của tôi, các bạn sẽ hiểu. Tôi chỉ cần thêm một định danh abstrac trong phương pháp của tôi và có những gì tôi muốn. Nó có thể có vẻ giống như một vấn đề newbie, nhưng tôi nghĩ rằng nó có thể được sử dụng để đơn giản hóa một số hoạt động đơn giản mà không trực tiếp quản lý chủ đề.

Những gì tôi đã làm để tái tạo một AsyncTask đơn giản sử dụng Java và mã JavaFX:

tạo ra một lớp AsyncTask trừu tượng

public abstract class AsyncTask { 

    abstract void onPreExecute(); 

    abstract void doInBackground(); 

    abstract void onPostExecute(); 

    public void execute() { 

     onPreExecute(); 

     new Thread(new Runnable() { 
      @Override 
      public void run() { 

       doInBackground(); 

       //Platform.runLater is a javafx code that executes onPost in Main Thread. 
       Platform.runLater(new Runnable() { 
        @Override 
        public void run() { 
         onPostExecute(); 
        } 
       }); 
      } 
     }).start(); 
    } 
} 

Mở rộng nó từ giai cấp công nhân của chúng tôi

public class LoginTask extends AsyncTask { 

    @Override 
    void onPreExecute() { 

     //Some code to preexecute in Main Thread 
     System.out.println("OnPreExecute - Main Thread: " + Platform.isFxApplicationThread()); 
    } 

    @Override 
    void doInBackground() { 

     //Some code to execute in background thread as internet requests 
     System.out.println("doInBackground - Main Thread: " + Platform.isFxApplicationThread()); 
    } 

    @Override 
    void onPostExecute() { 

     //Some code to execute in Main thread after background process has done, like update a view 
     System.out.println("onPostExecute - Main Thread: " + Platform.isFxApplicationThread());   
    } 

} 

Để gọi nó bạn có thể làm:

LoginTask taskTest = new LoginTask(); 
taskTest.execute(); 

và nhật ký của bạn sẽ là:

OnPreExecute - Main Thread: true 
doInBackground - Main Thread: false 
onPostExecute - Main Thread: true 
+0

Nhưng lý do bạn không thể sử dụng AsyncTask là gì? Chỉ tò mò thôi. –

+1

vì đó không phải là một Dự án Android hahaha –

+0

@VictorOliveira 'AsyncTask' chỉ là mã Java. Tốt đăng bài bằng cách này. –

-1

AsyncTask là cốt lõi của nó, một chuỗi. Nó là một chủ đề bắt đầu trong một chuỗi tùy ý khác (nhưng thường là chính), thực hiện nhiệm vụ của nó, và sau đó ủy nhiệm một nhiệm vụ bài viết cho luồng sinh ra nó (như tôi đã nói, thường là luồng chính).

Sự cố bạn sẽ gặp phải khi làm việc trong dự án này là lớp Handler xử lý (!) Tính năng ủy quyền luồng này mà tôi đã đề cập ở trên. Trình xử lý là một tính năng cốt lõi của Android cho phép từ nhiệm vụ chủ đề không chính đến chủ đề mà nó được tạo ra. Để bạn thực hiện một loại Java AsyncTask, bạn sẽ cần thêm một API ủy nhiệm luồng trong bản chất hoạt động giống như Trình xử lý .

+0

I nên thêm rằng vì Android có cơ chế liên lạc riêng của mình, mà AsyncTask phụ thuộc rất nhiều vào, bạn cần sao chép toàn bộ IPC trong dự án của bạn để đạt được điều đó. – YankeeWhiskey

+0

Ủy quyền chủ đề không nên quá khó khăn. Nguyên tắc cơ bản là tất cả thread "chính" là ngồi trên một xử lý vòng lặp '.run()' trên các đối tượng Runnable trong một hàng đợi. Java có hàng đợi được xây dựng có thể được sử dụng cho mục đích này. –

+0

@YankeeWhiskey bạn có thể tham khảo tài liệu về khả năng/yêu cầu IPC của tác vụ không đồng bộ. Tôi nghĩ rằng họ chỉ làm việc trong cùng một quá trình. –

Các vấn đề liên quan