13

Ví dụ: bạn sẽ làm điều gì đó sẽ mất vài giây và không muốn đóng băng giao diện người dùng của mình, phải không? Bạn có thể sử dụng một AsyncTask nhưng bạn không muốn tạo ra một lớp bên ngoài (hoặc bên trong) để giải quyết một vấn đề đóng băng nhỏ.Thực hành tốt có tạo AsyncTask ẩn danh cho quy trình đóng băng nhỏ được biết đến song song không?

Vì vậy, liệu có phải là một công cụ hay không?

package com.example.stackoverflowsandbox; 

import android.os.AsyncTask; 

public class Foo { 
    // E.g. before call foo method you change you Activity to loading state. 
    private void foo() { 
     new AsyncTask<Void, Void, Void>() { 
      @Override 
      protected Void doInBackground(final Void ... params) { 
       // something you know that will take a few seconds 

       return null; 
      } 

      @Override 
      protected void onPostExecute(final Void result) { 
       // continue what you are doing... 

       Foo.this.continueSomething(); 
      } 
     }.execute(); 
    } 

    private void continueSomething() { 
     // some code... 
    } 
} 

Tôi đã gặp phải điều đó khi tôi nén Bitmaps và lặp mảng lớn để cập nhật một số dữ liệu bên trong các mục.

+3

Tôi không thấy cách này tiết kiệm bất kỳ công việc nào so với việc tạo ra một lớp bên trong, chỉ trông có vẻ lộn xộn khủng khiếp IMO – tyczj

+1

Nó phụ thuộc ... những gì có thể xảy ra là Chủ đề (AsyncTask) tiếp tục chạy sau khi Hoạt động được đặt trong nền hoặc bị hủy. Nhưng nói chung điều này là khủng khiếp, bởi vì lớp vô danh được mượn ở đâu đó trong mã. –

+2

chỉ cho một câu hỏi dễ đọc, hãy nhớ rằng các đối tượng tạo từ lớp bên trong vô danh được gọi với ký hiệu 'OuterClass $ 2', và nếu bạn bắt đầu lồng vào lớp bên trong, debuggin có thể khó khăn – Blackbelt

Trả lời

24

Có, nhưng không phải cách bạn làm.

Hãy nhớ rằng bắt đầu từ Honeycomb mô hình thực hiện mặc định của AsyncTasks là sê-ri:

new AsyncTask<Void, Void, Void>() { 
     .... 
     .... 
    }.execute(); <------ serial execution 


Thay vì sử dụng một chấp hành viên bơi thread:

new AsyncTask<Void, Void, Void>() { 
     .... 
     .... 
    }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null); <------ parallel execution 
+0

Cảm ơn nhưng tôi có nghĩa là nếu là một mã thực hành tốt như thế. =] –

+0

nếu bằng 'như thế' bạn có nghĩa là instantiation asynctasks nặc danh thì câu trả lời là có. không có vấn đề về thực thi mã và ngay cả một nhà phát triển Android bắt đầu sẽ biết ý bạn là gì –

+5

CLARIFICATION: execute() chỉ chạy các nhiệm vụ liên quan đến các AsyncTask khác được gọi theo cách đó. Đó là một chủ đề nền duy nhất chạy chúng, nhưng nó vẫn còn song song wrt người gọi. – Debriter

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