2013-08-14 7 views
8

Der Titel sagt so ziemlich alles. Wenn Sie einen Rückruf von einer Klasse zu einer anderen haben und eine Methode innerhalb des Callbacks aufrufen müssen, die einen Kontext erfordert, welchen Kontext verwenden Sie? Ein übliches Beispiel wäre ein AsyncTask mit einem Rückruf an die Activity oder Fragment, die es verwendet.Korrekter Kontext zur Verwendung innerhalb von Rückrufen

Ich versuche im Allgemeinen zu vermeiden, getApplicationContext() zu verwenden, aber ich kann this nicht als Kontext innerhalb eines Rückrufs verwenden. Ist dies der Fall, wenn ein breiterer Kontext angemessen ist?

Um weiter zu klären, denke ich an einen Rückruf mit einer Schnittstelle zwischen einer AsyncTask und einer Aktivität. Sobald ich innerhalb der überschriebenen Schnittstellenmethode bin, kann ich den Aktivitätskontext nicht von dort bekommen.

+1

was Sie meinen „nichts lassen Sie' this'“ – tyczj

+1

Ich meine, wenn ich einen Kontext für etwas innerhalb einer Aktivität benötigt konnte ich nur verwenden dies als Kontext. Für ein Fragment würde ich getActivity() verwenden. – Rarw

Antwort

7

Verwenden Sie den Kontext der Aktivität. Beispiel:

MyAsyncTask mat = new MyAsyncTask(this); 

MyAsyncTask contructor:

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

methodToCall() MyActivity Methode zu nennen, aus MyAsyncTask:

((MyActivity)mContext).methodToCall(); 

Edit 1:

Ich schätze Ihre Proble m ist dies:

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

Umgehung:

  • ein Verfahren, in MyActivity deklarieren: getContext()

    public Context getContext() { 
        return (Context)this; 
    } 
    
    b.setOnClickListener(new OnClickListener() {  
        @Override 
        public void onClick(View v) { 
         Button newButton = new Button(getContext()); // Will work 
        } 
    }); 
    
  • Verwendung MyActivity.this anstelle von this.

  • Eine andere Möglichkeit besteht darin, dass MyActivity implementiert die Schnittstelle angeben:

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

Wenn ich einen Rückruf zu der Aktivität über eine Schnittstelle habe - was würde ich innerhalb dieser Methode verwenden? Sobald ich die Schnittstellenmethode überschreibe, kann ich den Aktivitätskontext nicht erhalten, es sei denn, oder der AsyncTask-Kontext, ohne das durch die Schnittstelle auch zu übergeben, kann ich? – Rarw

+0

@Rarw Ich finde deinen Kommentar ein wenig verwirrend.Lassen Sie uns also Aktivität A implementiert View.OnClickListener. Aktivität A definiert dann die 'onClick (View)' Methode. Fragen Sie, ob Sie den Kontext von Activity A (oder seine Methoden) in 'onClick (View)' verwenden können? Wenn das nicht deine Frage wäre, könntest du ein Beispiel dafür benutzen, um es zu erklären? – Vikram

+0

@Rarw Von deiner Bearbeitung zu der Frage, ich denke, ich weiß, worauf du hinaus willst. Siehe Bearbeiten 1 oben. – Vikram

0

Es ist ein Thema, aber "Lecks". Erstens ist die zu erledigende Aktivität nicht gut. Laut einigen anderen Vorschlägen sollten Leute getApplication oder getApplicationContext verwenden. Aber Sie können WeakReference für Ihre Wrapper verwenden, das heißt:

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

statisch verwenden Denken Sie daran, Ihre Klasse zu markieren, könnte es Potenzial „dieses“ an den Host Aktivität vermeiden.

könnte Ihnen einige Anregungen gegeben haben, könnte nichts :)