2013-08-14 26 views
8

Tiêu đề khá nhiều nói lên tất cả. Nếu bạn có một cuộc gọi lại từ lớp này sang lớp khác và cần gọi một số phương thức từ bên trong cuộc gọi lại yêu cầu ngữ cảnh ngữ cảnh chính xác để sử dụng là gì? Một ví dụ phổ biến sẽ là một số AsyncTask với gọi lại tới Activity hoặc Fragment đã sử dụng nó.Ngữ cảnh chính xác để sử dụng trong các cuộc gọi lại

Tôi thường cố gắng tránh sử dụng getApplicationContext() nhưng tôi không thể sử dụng this làm ngữ cảnh từ trong cuộc gọi lại. Đây có phải là trường hợp sử dụng ngữ cảnh rộng hơn không?

Để làm rõ thêm, tôi đang nghĩ về một cuộc gọi lại với giao diện giữa AsyncTask và hoạt động. Khi tôi ở trong phương thức giao diện bị ghi đè, tôi không thể lấy bối cảnh hoạt động từ bên trong.

+1

những gì bạn có ý nghĩa bởi "không có gì là cho phép bạn sử dụng' this'" – tyczj

+1

Ý tôi là nếu tôi cần một bối cảnh cho một cái gì đó trong một hoạt động tôi có thể chỉ cần sử dụng đây là một ngữ cảnh. Đối với một mảnh, tôi muốn sử dụng getActivity(). – Rarw

Trả lời

7

Sử dụng ngữ cảnh của Hoạt động. Ví dụ:

MyAsyncTask mat = new MyAsyncTask(this); 

MyAsyncTask contructor:

public MyAsyncTask(MyActivity context) { 
    mContext = context; 
} 

Để gọi phương thức MyActivity của methodToCall() từ bên trong MyAsyncTask:

((MyActivity)mContext).methodToCall(); 

Sửa 1:

Tôi đoán proble của bạn m là:

public class MyActivity extends Activity { 

    Button b; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.some_layout); 

     b = (Button) findViewById(...); 

     b.setOnClickListener(new OnClickListener() {  
      @Override 
      public void onClick(View v) { 
       Button newButton = new Button(this);  // Won't work!! 
      } 
     }); 
    } 
} 

Cách giải quyết:

  • Khai báo một phương pháp trong MyActivity: getContext()

    public Context getContext() { 
        return (Context)this; 
    } 
    
    b.setOnClickListener(new OnClickListener() {  
        @Override 
        public void onClick(View v) { 
         Button newButton = new Button(getContext()); // Will work 
        } 
    }); 
    
  • Sử dụng MyActivity.this ở vị trí của this.

  • Một cách khác là để nêu MyActivity mà thực hiện giao diện:

    public class MyActivity extends Activity implements View.OnClickListener { 
    
        .... 
        .... 
    
        @Override 
        public void onClick(View v) { 
         Button newButton = Button (this)    // Will Work 
        } 
    } 
    
+0

Nếu tôi có một cuộc gọi lại đến hoạt động bằng giao diện - tôi sẽ sử dụng cái gì trong phương thức đó? Một khi tôi ghi đè lên phương thức giao diện, tôi không thể có được bối cảnh hoạt động trừ khi hoặc bối cảnh AsyncTask mà không qua đó thông qua giao diện cũng có thể tôi? – Rarw

+0

@Rarw Tôi tìm thấy bình luận của bạn một chút khó hiểu.Vì vậy, giả sử Activity A triển khai View.OnClickListener. Activity A sau đó định nghĩa phương thức 'onClick (View)'. Bạn có hỏi liệu bạn có thể sử dụng ngữ cảnh của Activity A (hoặc các phương thức của nó) bên trong 'onClick (View)' không? Nếu đây không phải là câu hỏi của bạn, bạn có thể sử dụng một ví dụ để giải thích nó không? – Vikram

+0

@Rarw Từ chỉnh sửa của bạn cho câu hỏi, tôi nghĩ rằng tôi biết những gì bạn đang nhận được. Xem Chỉnh sửa 1 ở trên. – Vikram

0

Nó là một aber chủ đề "rò rỉ". Thứ nhất, Hoạt động được thông qua là không tốt. Theo một số gợi ý khác mà mọi người nên sử dụng getApplication hoặc getApplicationContext. Nhưng bạn có thể sử dụng WeakReference cho trình bao bọc của bạn, tức là:

static class X { 
    WeakReference<Activity> context; 
    X(Activity context) { 
     this.context = new WeakReference<Activity>(context); 
    } 
} 

Hãy nhớ sử dụng tĩnh để đánh dấu lớp học của bạn, nó có thể tránh tiềm năng "này" đối với Hoạt động lưu trữ của bạn.

Might đã đưa cho bạn một số gợi ý, có thể không có gì :)

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