2013-08-14 12 views
8

Tytuł prawie wszystko mówi. Jeśli masz wywołanie zwrotne od jednej klasy do drugiej i musisz wywołać pewną metodę z poziomu wywołania zwrotnego wymagającego kontekstu, jaki jest właściwy kontekst do użycia? Typowym przykładem może być AsyncTask z oddzwonieniem do Activity lub , który go użył.Prawidłowy kontekst do użycia w ramach wywołań zwrotnych

Ogólnie staram się unikać używania getApplicationContext(), ale nie mogę użyć this jako kontekstu z poziomu wywołania zwrotnego. Czy jest to przypadek, w którym zastosowanie szerszego kontekstu jest właściwe?

Aby lepiej wyjaśnić, myślę o wywołanie zwrotnym z interfejsem między AsyncTask i działania. Po przejściu przez nadpisaną metodę interfejsu nie mogę uzyskać kontekstu działań z tamtej strony.

+1

co masz na myśli przez „Nic nie jest pozwalając użyć' this'” – tyczj

+1

To znaczy, gdybym potrzebowała kontekst coś się w zakresie działalności mogłem po prostu użyć to jako kontekst. Dla fragmentu użyłbym getActivity(). – Rarw

Odpowiedz

7

Skorzystaj z kontekstu działania. Przykład:

MyAsyncTask mat = new MyAsyncTask(this); 

MyAsyncTask contructor:

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

Aby wywołać metodę MyActivity za methodToCall() od wewnątrz MyAsyncTask:

((MyActivity)mContext).methodToCall(); 

Edit 1:

Domyślam twój proble m to:

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!! 
      } 
     }); 
    } 
} 

Rozwiązanie:

  • stwierdzenie sposób, w 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 
        } 
    }); 
    
  • Zastosowanie MyActivity.this zamiast this.

  • Innym sposobem jest stwierdzenie, że MyActivity implementuje interfejs:

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

Jeśli mam wywołanie zwrotne do działania za pomocą interfejsu - co powinienem użyć w tej metodzie? Kiedy nadpisuję metodę interfejsu, nie mogę uzyskać kontekstu działań, chyba że lub kontekstu AsyncTask bez przekazywania go również przez interfejs, czy mogę? – Rarw

+0

@Rarw Uważam, że twój komentarz jest nieco mylący.Powiedzmy, że Activity A implementuje View.OnClickListener. Aktywność A następnie definiuje metodę 'onClick (View)'. Czy pytasz, czy możesz użyć kontekstu działania A (lub jego metod) wewnątrz 'onClick (View)'? Jeśli to nie było Twoje pytanie, czy możesz posłużyć się przykładem, aby to wyjaśnić? – Vikram

+0

@Rarw Od twojej edycji do pytania, myślę, że wiem, w co się pakujesz. Zobacz Edycja 1 powyżej. – Vikram

0

Jest to temat aber "przecieki". Po pierwsze, działanie, które należy zdać, nie jest dobre. Zgodnie z innymi sugestiami, że ludzie powinni używać getApplication lub getApplicationContext. Ale można użyć WeakReference do owinięcia, tj:

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

Pamiętaj użyciu statycznej, aby zaznaczyć swoją klasę, może to zapobiec ewentualnym „to” do hosta aktywny.

może przekazać pewne sugestie, może nic :)

Powiązane problemy