2011-10-21 42 views
6

Có thể cho Runnable trả về một giá trị không? Tôi cần phải làm một số công việc chuyên sâu trên Editable và sau đó trả lại nó. Đây là mã giả của tôi.Một Runnable có thể trả về một giá trị không?

public class myEditText extends EditText { 
... 
private Editable workOnEditable() { 
    final Editable finalEdit = getText(); 
    Thread mThread = new Thread(new Runnable() { 
     public void run() { 


       //do work 

       //Set Spannables to finalEdit 

     } 
    }); 
    mThread.start(); 
    return finalEdit; 
} 
... 
} 

Vì vậy, rõ ràng vấn đề đầu tiên của tôi là tôi đang cố gắng thay đổi finalEdit, nhưng nó phải là cuối cùng để truy cập vào và ra khỏi luồng, phải không? Cách chính xác để làm điều này là gì?

+2

'Runnable' không thể nhưng' Callable' can. Sử dụng với một 'Executor'. –

+0

Cảm ơn denis, có vẻ như điều đó sẽ hoạt động – bwoogie

Trả lời

2

Trong Java, Runnable không thể "trả về" một giá trị.

Trong Android cụ thể, cách tốt nhất để xử lý loại kịch bản của bạn là với AsyncTask. Đó là một lớp chung để bạn có thể chỉ định loại bạn muốn truyền vào và kiểu được trả về hàm onPostExecute.

Trong trường hợp của bạn, bạn sẽ tạo một AsyncTask<Editable, Void, TypeToReturn>. Một cái gì đó như:

private class YourAsyncTask extends AsyncTask<Editable, Void, Integer> { 
    protected Long doInBackground(Editable... params) { 
     Editable editable = params[0]; 
     // do stuff with Editable 
     return theResult; 
    } 

    protected void onPostExecute(Integer result) { 
     // here you have the result 
    } 
} 
1

Chỉ tồn tại sau đây để chỉ ra việc sử dụng "đóng giả" trong Java, vì không phù hợp vì chúng có thể trong trường hợp này.


Java cho phép đóng giả thông qua các loại có thể thay đổi được lưu trữ trong các biến cuối cùng.

Xem Java's pseudo-closures by Christopher Martin bỏ qua phần "Giả mạo". Ông giới thiệu một loại có thể thay đổi ValueHolder<T>:

private static class ValueHolder<T> { 
    T value; 
} 
... 
final ValueHolder<Integer> i = new ValueHolder<Integer>(); 
... 
i.value = 42; 

Mã hóa hạnh phúc.

2

Bạn nhận ra rằng chuỗi tiếp tục hoạt động khi kết thúc hàm workOnEditable(), phải không? Nếu bạn muốn có một phản hồi đồng bộ, hãy loại bỏ chuỗi. Nếu không, hãy sử dụng Trình xử lý để chuyển dữ liệu trở lại luồng chính.

0

Tôi đã thực hiện 2 phương pháp tiện ích xung quanh Runnable cho phép bạn đăng runnable và chặn cho đến khi bạn nhận được kết quả.

Bạn có thể xem tại đây: https://github.com/Petrakeas/HVTHandler/

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