6

Tôi đã xác định một chuỗi riêng biệt bằng cách mở rộng lớp AsyncTask. Trong lớp này, tôi thực hiện một số Toasts and Dialogs trong các phương thức onPostExecuteonCancelled của AsyncTask. Các nâng cốc chúc mừng yêu cầu bối cảnh của ứng dụng như vậy mà tất cả những gì cần làm là:Cách tốt nhất để nhận/sử dụng ngữ cảnh bên trong AsyncTask là gì?

Toast.makeText(getApplicationContext(),"Some String",1); 

các hộp thoại được tạo bằng AlertDialog.Builder mà cũng đòi hỏi một bối cảnh trong constructor của nó. Tôi có nghĩ rằng bối cảnh này phải là bối cảnh của Hoạt động? tức là

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 

trong đó getActivity có thể là lớp do người dùng xác định trả về hoạt động hiện tại. Nếu vậy cách tốt nhất để xử lý tình huống này là gì? Tạo một lớp như getActivity hoặc chuyển ngữ cảnh của hoạt động hiện tại tới hàm tạo của AsyncTask?

Tôi đoán tôi đang cố gắng hiểu việc sử dụng Context - Tôi đã nhận thấy rằng rò rỉ bộ nhớ có thể là một vấn đề (không thực sự hiểu điều này) và cách sử dụng getApplicationContext() là cách tiếp cận tốt nhất có thể.

Trả lời

12

Đơn giản chỉ cần tạo ra AsyncTask như một lớp bên của hoạt động của bạn, hoặc vượt qua bối cảnh đến Constructor của AsyncTask.

Inner lớp: MyActivity.java

public class MyActivity extends Activity { 

    // your other methods of the activity here... 


    private class MyTask extends AsyncTask<Void, Void, Void> { 

     protected Void doInBackground(Void... param) { 

      publishProgress(...); // this will call onProgressUpdate(); 
     } 

     protected Void onProgressUpdate(Void... prog) { 

      Toast.makeText(getActivity(), "text", 1000).show(); 
     } 
    } 
} 

vị thi công: MyTask.java

public class MyTask extends AsyncTask<Void, Void, Void> { 

    Context c; 

    public MyTask(Context c) { 
      this.c = c; 
    } 

    protected Void doInBackground(Void... param) { 

      publishProgress(...); // this will call onProgressUpdate(); 
    } 

    protected Void onProgressUpdate(Void... prog) { 
      Toast.makeText(c, "text", 1000).show(); 
    } 
} 

Bên cạnh đó, xin đừng quên gọi .show() trên Dialog của bạn .

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
builder.show(); 
+0

Cảm ơn Phil. AsyncTask của tôi hiện là lớp bên trong hoạt động của tôi (như bạn đã trình bày ở trên). Tuy nhiên, trong khi điều này làm việc cho 'Toast.makeText (getApplicationContext(), ...' trong các phương thức UI 'MyTask',' AlertDialog.Builder (getApplicationContext()) 'không hoạt động. Tôi đoán đây là vì nó không Vì vậy, nó không phải là một yêu cầu để vượt qua bối cảnh của hoạt động để 'MyTask' của constructor? Hoặc tôi thiếu một cái gì đó? –

+0

Bạn có thể gửi mã đầy đủ của nơi bạn thực hiện hộp thoại của bạn? Cũng đừng quên Gọi .show() trên hộp thoại –

+0

Được rồi, có! Cả hai 'Toast' và' AlertDialog' hoạt động khi chuyển ngữ cảnh tới hàm tạo 'MyTask' như bạn đã chỉ ra ở trên, tức là tạo' MyTask' bằng 'MyTask (này) 'từ một sự kiện onClick trong hoạt động chính. Phải, vì vậy tôi chỉ cần làm rõ:' MyTask (this) 'chuyển ngữ cảnh hoạt động của' MyTask' có thể được sử dụng bởi cả 'Toast' và' AlertDialog'. , trong khi 'Toast' có thể sử dụng ngữ cảnh ứng dụng bằng cách sử dụng' getApplicationContext() ',' AlertDialog' không thể, nghĩa là nó cần s bối cảnh của hoạt động - nghĩ rằng đó là nơi tôi đã đi sai. –