9

标题基本概括了所有内容。如果你有一个从一个类到另一个类的回调,并且需要从回调中调用一些需要上下文的方法,那么正确的上下文是什么?一个常见的例子是一个对使用它的或AsyncTask的回调。ActivityFragment

我通常尽量避免使用getApplicationContext(),但我不能this用作回调中的上下文。这是否适合使用更广泛的上下文?

为了进一步澄清,我正在考虑使用 AsyncTask 和活动之间的接口进行回调。一旦我进入被覆盖的接口方法,我就无法从那里获取活动上下文。

4

2 回答 2

9

使用 Activity 的上下文。例子:

MyAsyncTask mat = new MyAsyncTask(this);

MyAsyncTask 构造函数:

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

methodToCall()从内部调用 MyActivity 的方法MyAsyncTask

((MyActivity)mContext).methodToCall();

编辑1:

我猜你的问题是这样的:

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

解决方法:

  • 在 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
        }
    });
    
  • MyActivity.this代替this. _

  • 另一种方式是声明 MyActivity 实现了接口:

    public class MyActivity extends Activity implements View.OnClickListener {
    
        ....
        ....
    
        @Override
        public void onClick(View v) {
            Button newButton = Button (this)                // Will Work
        }
    }
    
于 2013-08-14T19:48:37.323 回答
0

这是一个“泄漏”的话题。首先要通过的Activity不好。根据其他一些建议,人们应该使用 getApplication 或 getApplicationContext。但是您可以将 WeakReference 用于您的包装器,即:

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

请记住使用静态标记您的类,它可以避免对您的主机 Activity 潜在的“this”。

可能给了你一些建议,可能什么都没有:)

于 2013-08-14T19:51:35.163 回答