2012-01-25 31 views
5

Tôi đang cố gắng phân lớp lớp android.os.AsyncTask một cách tổng quát. Về cơ bản tôi chỉ muốn thêm một thuộc tính vào nó. Vấn đề là, tôi vẫn muốn có thể sử dụng nó như một lớp vô danh.Java: Phân lớp AsyncTask

import android.content.Context; 
    import android.os.AsyncTask; 

    public class KAsyncTask extends AsyncTask<Params, Progress, Result> { 
     public Context c; 

    } 

Tôi đã thử phân lớp nó, nhưng tôi không thể quấn nó quanh đầu như thế nào tôi phải làm điều này.

Kính trọng, EZFrag

+0

bạn có thể muốn xem ví dụ này http://www.etosis.com/posts/asynctask-helpers –

Trả lời

16

Bạn có nghĩa là bạn vẫn muốn nó là một mẫu lớp trừu tượng như AsyncTask? Việc kê khai sẽ là:

public abstract class KAsyncTask<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> { 
    public Context c; 

} 
+0

Cảm ơn Reuben, mà làm việc. Tôi sẽ chấp nhận câu trả lời của bạn vào ngày mai ... Tôi muốn chia sẻ những gì tôi đã làm dưới đây. – EZFrag

2

Nếu tôi hiểu câu hỏi của bạn một cách chính xác, bạn đang tìm kiếm một cách nhanh chóng một vô danh bên trong AsyncTask mà còn có một biến ví dụ. Bạn dự định chuyển giá trị bổ sung đó đến số AsyncTask như thế nào?

AFAIK, Java không cho phép bạn ghi đè lên hàm tạo của lớp bên trong ẩn danh. Vì vậy, hy vọng duy nhất của bạn là để vượt qua trong Context như là một phần của loại Params (mà xảy ra là một Varargs). Điều này có nghĩa là bạn phải tạo loại ParamsContext; hoặc sử dụng Stringserialize/ParcelContext của bạn làm String. Tôi thành thật cảm thấy đây không phải là nỗ lực đáng giá và là quá nhiều của một hack.

Có lý do nào bạn muốn sử dụng ẩn danhAsyncTask? Tôi sẽ đề nghị bạn tạo một triển khai có tên là AsyncTask.

+0

+1, đó là cách chính xác để suy nghĩ về vấn đề IMO. – Guillaume

6

Cảm ơn Reuben, nó hoạt động 100% như mong đợi.

Dưới đây là những gì tôi có bây giờ:

import android.content.Context; 
    import android.os.AsyncTask; 

    public abstract class KAsyncTask<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> { 
     public Context context; 

     public KAsyncTask<Params, Progress, Result> setContext(Context c){ 
      this.context = c; 
      return this; 
     } 
    } 

Và đây là cách tôi sử dụng nó:

new KAsyncTask<Void, Void, Void>() { 

     @Override 
     protected void onPreExecute() { 
      // TODO Auto-generated method stub 
      Toast.makeText(context, "Connecting to Server...", Toast.LENGTH_LONG).show(); 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      // TODO Auto-generated method stub 
      //super.onPostExecute(result); 
      Toast.makeText(context, "Responce Recieved.", Toast.LENGTH_LONG).show(); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      // TODO Auto-generated method stub 

      //Do webservice calls in here 

      return null; 
     } 

    }.setContext(this).execute(); 

tôi cần bối cảnh để hiển thị các thông điệp cho người dùng từ các nhiệm vụ riêng của mình.

Kính trọng, EZFrag

+1

Bạn cũng có thể sử dụng YourActivityName.this từ AsynkTask ẩn danh của bạn mà không cần phân lớp phụ. –

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