2012-01-26 25 views
5

Tôi có 6 loại khác nhau của List kết quả sau khi hoàn thành AsyncTask. Và các kết quả List phải được trả về Activity. Ví dụ: List<A>, List<B>, List<C>, List<D>, List<E> và cuối cùng là List<F>.Cách trả lại Danh sách ẩn danh hoặc ArrayList trên AsyncTask trong Android

Đây là tôi AsyncTask:

public class myAsync extends AsyncTask<String, String, List> { 

    private List resultList; 

    @Override 
    protected List doInBackground(String... params) { 
     //params[0] is url 
     //params[1] is type 
     callAPI api = new callAPI(params[0], params[1]); 
     // According to type api decides type of List and generates 
     return api.getJSON(); // returns a List which already parse JSON 
    } 

    @Override 
    protected void onPostExecute(List result) { 
     // Result is here now, may be 6 different List type. 
     this.resultList = result 
    } 

    // returns result 
    public List getResultList() { return this.resultList; } 
} 

Tôi sẽ gọi AsyncTask như thế này:

myAsync task = new myAsync(); 
task.execute(params); 
List myList = task.getResultList(); // type is uncertain 
Log.d("Tag", Integer.toString(myList.size()); 

Bạn biết đấy, tôi phải chỉ ra những kiểu trả về (Result) giữa <> thẻ. Nếu tôi chọn loại cụ thể cho List, nó không hoạt động đối với các loại khác.

Thật vậy, tôi đã cố gắng trả lại List<Object> và chỉ List loại. Nhưng không hiệu quả.

Tôi không muốn sử dụng 6 khác nhau Async. Có thể giải quyết vấn đề này chỉ với AsyncTask không? Tôi đoán tôi cần danh sách ẩn danh hoặc một cái gì đó tương tự không chắc chắn. Bất cứ ai có thể giải thích điều này?

+0

Bạn có thể bỏ qua <>, nó sẽ không phải là một lỗi, nó chỉ cảnh báo bạn. – kosa

+0

Bạn có nghĩa là tôi nên sử dụng định nghĩa này: 'AsyncTask '. Nếu có, thì loại trả lại là gì? Tôi đã trả về tất cả các loại như một danh sách bình thường, có lỗi NullException. –

+0

Đăng stacktrace ở đây, tôi nghi ngờ NullPointer bạn đang nhận được có thể từ một nơi khác. – kosa

Trả lời

9

Trước tiên, tôi phải chỉ ra rằng chuỗi trong đó bạn có được danh sách là không phải là chính xác. Hãy để tôi chứng minh:

// Initialize myAsync 
myAsync task = new myAsync(); 

// This will do work for some period of time, this statement DOES NOT 'block' 
// till myAsync completes, it will run it in the background 
task.execute(params); 

// This will return null because by the time you get here, task.execute most 
// likely hasn't finished yet. 
task.getResultList(); 

Edit: Bây giờ bạn đã bao gồm những gì bạn muốn để làm với kết quả danh sách, đây là cách bạn sẽ thay đổi phương pháp onPostExecute của bạn:

@Override 
protected void onPostExecute(List result) { 
    Log.d(TAG, "The returned list contains " +result.size()+ "elements"); 
    // Do anything else you need to with the returned list here 
} 

Vì vậy, để tóm tắt, nếu bạn cần làm bất kỳ điều gì khác với danh sách được trả lại (ngoài việc in kích thước của chúng), ví dụ như so sánh, in các mục, v.v, bạn cần thực hiện điều đó theo phương pháp onPostExecute.

+0

Xin lỗi vì lỗi cú pháp. Tất nhiên nó phải là task.getResultList(). Đã sửa ngay. Và bạn nói đúng, sớm cho phương thức getResultList(). Làm thế nào tôi có thể gọi? –

+1

@OgulcanOrhan Cũng như tôi đã chỉ ra trong câu hỏi [trước] của bạn (http://stackoverflow.com/a/9019395/1101070), bạn thường muốn sử dụng phương thức 'onPostExecute' của AsyncTask của bạn để _do bất cứ điều gì bạn cần để do_ với (các) danh sách. Chỉnh sửa câu hỏi của bạn để bao gồm những gì bạn _do_ với 'task.getResultList()' và tôi có thể cung cấp cho bạn một câu trả lời tốt hơn. –

+0

Cập nhật 'doInBackground' và' onPostExecute'. Tôi hy vọng nó rõ ràng bây giờ. –

2

Tùy thuộc vào nội dung của danh sách (A, B, C, v.v.), bạn có thể tạo giao diện cho chúng.

Vì vậy, nếu A, B, C vv là đối tượng, bạn có thể tạo một Giao diện mà chúng tôi gọi là ListContentInterface. Mỗi phần tử của bạn phải triển khai thực hiện ListContentInterface. Sau đó bạn có thể chỉ ra các loại như:

List<ListContentInterface>. 

Sau đó thì bạn có thể kiểm tra những gì nội dung của danh sách thực sự là, bằng cách lấy phần tử đầu tiên của danh sách, và kiểm tra nó là môn học:

if(element.getClass() == ClassToTestFor.class) ... 

Nếu đối tượng có bất kỳ phương thức chung nào, bạn nên chỉ định chúng trong giao diện. Nếu chúng có TẤT CẢ các phương thức chung, bạn có thể sử dụng danh sách List trực tiếp, mà không cần kiểm tra đối với lớp của các đối tượng (Vì chúng có thể làm tất cả những gì giao diện định nghĩa).

Tôi hy vọng điều này có ý nghĩa với bạn. Nó có thể không phải là cách sử dụng tốt nhất các giao diện hoặc giải pháp tốt nhất, nhưng nó có thể giải quyết vấn đề của bạn.

+0

Có, tôi có thể tạo giao diện cho 6 đối tượng khác nhau này và tôi sẽ làm. Nhưng điều gì sẽ thay đổi? Tôi không thể hiểu được các bước tiếp theo. –

+2

Khi bạn có tất cả các mục trong giao diện, bạn có thể tạo danh sách chứa các đối tượng triển khai giao diện đó. Bằng cách đó bạn có thể sử dụng cùng một loại danh sách, cho tất cả các đối tượng của bạn. Sau đó, nếu bạn cần làm điều gì đó cụ thể cho các loại mục khác nhau, bạn chỉ có thể lấy các phần tử ra khỏi danh sách và kiểm tra xem chúng là lớp nào, trước khi thực hiện logic cụ thể cho từng mục. –

0

Tôi đang giải quyết loại sự cố này bằng cách sử dụng execute(). Get();

Ví dụ

call from activity 

    ArrayList<String> arraylistitem= new jsonparsing(getActivity()).execute().get(); 

    In async task 

    public class jsonparsing extends AsyncTask<Void, Void, ArrayList<String>> 
    { 
    public jsonparsing(Activity activity) 
     { 
      this.activity = activity; 
      arraylistitem = new ArrayList<String>();   
     } 

     protected ArrayList<String> doInBackground(Void... arg0) 
     { 
       // Do anything else you need to with the returned list here 
      return arraylistitem; 
      } 
    } 
Các vấn đề liên quan