2011-08-15 36 views
23

Tôi muốn tạo trước một Toast khi tác vụ nền được hoàn thành, chỉ để cho người dùng biết rằng nó đã hoàn tất.Làm cách nào để chuyển một ngữ cảnh tới AsyncTask?

Tôi đã tạo một lớp mới cho asyncTask của mình nhưng tôi không thể sử dụng getApplicationContext() trong lớp này.

Tôi đang sử dụng task.execute(getTempFile(this), getApplicationContext()); để chạy các tác vụ. getTempFile trả về một đối tượng File, và tôi đã cố gắng chuyển ngữ cảnh như một đối tượng Context.

Lớp Nhiệm vụ của tôi có 3 biến AsyncTask<Object, Integer, Integer> để ngữ cảnh nằm trong đối tượng thứ hai. Tuy nhiên, điều này làm hỏng ứng dụng.

Sửa

public class LocationActivity extends Activity implements LocationListener { 
    protected void handleImage(Bitmap thumbnail){ 
     PushDataToServer task = new PushDataToServer(); 
     task.execute(getTempFile(this), getApplicationContext()); 
    } 
} 




public class PushDataToServer extends AsyncTask<Object, Integer, Integer> { 

    Context context; 

    @Override 
    protected Integer doInBackground(Object... params) { 
     // TODO Auto-generated method stub 
     this.context = (Context) params[1]; 
     File file = (File) params[0]; 
     return null; 
    } 

    protected void onPostExecute(String result) { 
     Toast toast = Toast.makeText(this.context, "All done!", Toast.LENGTH_SHORT); 
     toast.show(); 
    } 

} 
+0

Xin vui lòng gửi lớp AsyncTask của bạn và bộ xương của lớp học chính của bạn :) – Codeman

+0

Đã cập nhật câu hỏi của tôi với mẫu mã. – dotty

Trả lời

75

Vượt qua đối tượng Context vào hàm tạo của AsyncTask.

Mẫu mã:

public class MyTask extends AsyncTask<?, ? ,?> { 
    private Context mContext; 

    public MyTask(Context context) { 
     mContext = context; 
    } 
} 

và sau đó, khi bạn đang xây dựng AsyncTask của bạn:

MyTask task = new MyTask(this); 
task.execute(...); 
+0

Bánh mì nướng không bao giờ được hiển thị. Bất kỳ ý tưởng nào khác? – dotty

+0

'Toast' sẽ được hiển thị khi bạn đang gọi' show() 'trên nó trong các hàm chạy trên chuỗi giao diện người dùng. Bạn có chắc chắn đây là trường hợp? – Wroclai

+0

Bánh mì nướng nằm trong phương thức onPostExecute() của tôi. Mẫu mã ở trên. – dotty

0

Bạn nói hoàn cảnh của bạn là trong đối tượng thứ hai, tuy nhiên đối tượng thứ hai của bạn là Integer. Đây có phải là vấn đề của bạn? Ngoài ra - một gợi ý khác là đặt lớp AsyncTask của bạn thành lớp bên trong riêng tư cho hoạt động của bạn - theo cách đó tôi chắc chắn bạn sẽ có quyền truy cập vào phương thức getApplicationContext().

2

Vượt qua nó trong hàm tạo, không phải là tham số phương thức. Sau đó, bạn không cần phải phụ thuộc vào các tham số chung.

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