2013-03-07 35 views
6

Tôi có một vài phương thức AsyncTask riêng mà tôi muốn chia ra thành các lớp ngoài công cộng. Trong ứng dụng của tôi, tôi có một ứng dụng mở rộng lớp công khai chứa một số thói quen chia sẻ mà tôi muốn truy cập từ các phần khác nhau của ứng dụng của tôi. Tuy nhiên, khi tôi phá vỡ lớp AsyncTask, tôi không còn có thể gọi phương thức getApplicationContext() để lấy một tham chiếu đến thư viện ứng dụng của tôi (lớp này không kế thừa bất kỳ thứ gì từ Hoạt động bây giờ). getBaseContext() cũng sẽ có vấn đề. Tôi có nên đi qua một bối cảnh vào AsyncTask khi nó được instantiated và xây dựng từ đó? Bạn không chắc chắn liệu điều đó có an toàn hay không.getApplicationContext trong lớp AsyncTask?

import java.util.ArrayList; 
import android.os.AsyncTask; 

public class DlTask extends AsyncTask 
{ 
    long totalbytes = 0; 
    long totalread = 0; 
    ArrayList <String> data; 

    @Override 
    protected void onPreExecute() 
    { 
     AppLib lib = (AppLib) getApplicationContext(); 

     lib.saveStatusText ("Contacting " + lib.getServerAddress() + ":" + lib.getServerPort() + "..."); 
     super.onPreExecute(); 
    } 

     @Override 
     protected Object doInBackground (Object... params) 
     { 
     data = lib.sendCommand (CMD_LIST); 
     return true; 
     } 

     @Override 
     protected void onPostExecute (Object result) 
     { 

     if (data != null) 
     { 
        lib.saveStatusText (data.size() + " files found"); 
     } 
     else 
     { 
      Log.d (TAG, "data is null"); 
      Toast.makeText (getBaseContext(), msg, Toast.LENGTH_SHORT).show();      
     } 

     super.onPostExecute(result); 
     } 

} 
+1

Bạn phải chuyển trong ngữ cảnh trong hàm tạo. –

+0

bạn nên sử dụng hàm tạo AsyncTask với các hàm ngữ cảnh. – Ashok

Trả lời

9

Tôi có nên đi qua một bối cảnh vào AsyncTask khi nó được khởi tạo và xây dựng từ đó?

Bạn không có lựa chọn, vì bạn sẽ không thể nhận được Context bằng bất kỳ phương tiện nào khác.

+0

Bạn có thể xây dựng @CommonsWare không? Tại sao 'getApplicationContext()' không hoạt động từ các phần giao diện người dùng của 'AsyncTask'? (ví dụ: 'onPreExecute()' hoặc 'onPostExecute()') Liên kết này 'gợi ý' nó có thể hoạt động, Nhưng thực tế của tôi cho thấy nó sẽ không biên dịch (Sdk 8-17); http://www.daniweb.com/software-development/mobile-development/threads/449375/how-to-get-context-in-asynctask – donfede

+1

@donfede: "Tại sao getApplicationContext() không hoạt động từ các phần giao diện người dùng của AsyncTask? " - bởi vì 'getApplicationContext()' là một phương thức trên 'Context', và' AsyncTask' không kế thừa từ 'Context'. – CommonsWare

+2

sẽ không gây ra rò rỉ nếu hoạt động bị phá hủy trước khi asynctask kết thúc? – MikeIsrael

0

Hoặc chuyển một Ngữ cảnh trong hàm tạo của AsyncTask của bạn hoặc sử dụng biến tĩnh trong lớp Ứng dụng của bạn để truy cập nó (đặt sMyInstace = this;). Các giải pháp đầu tiên là thích hợp hơn mặc dù.

0

Bạn nên làm như thế này. Trong trường hợp của tôi, nó hoạt động:

public class DlTask extends AsyncTask { 
    private Context context; 

    public DlTask(Context context) { this.context = context; } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     .......... 
    } 

    @Override 
    protected Object doInBackground (Object... params) 
    { 
     data = lib.sendCommand (CMD_LIST); 

     return true; 
    } 

    @Override 
    protected void onPostExecute (Object result) 
    { 

     if (data != null) 
    { 
     lib.saveStatusText (data.size() + " files found"); 
    } 
    else 
    { 
     Log.d (TAG, "data is null"); 
     Toast.makeText (context, msg, Toast.LENGTH_SHORT).show();    
     //You can use the CONTEXT like this (passing the context variable like parameter 
    } 

    super.onPostExecute(result); 
    } 
Các vấn đề liên quan