在回调中使用的正确上下文

Rar*_*arw 9 android callback android-context android-asynctask

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

我通常尽量避免使用,getApplicationContext()但我不能this在回调中用作上下文.这是一个使用更广泛的背景是合适的情况吗?

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

Vik*_*ram 8

使用Activity的上下文.例:

MyAsyncTask mat = new MyAsyncTask(this);
Run Code Online (Sandbox Code Playgroud)

MyAsyncTask构造函数:

public MyAsyncTask(MyActivity context) {
    mContext = context;
}
Run Code Online (Sandbox Code Playgroud)

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

((MyActivity)mContext).methodToCall();
Run Code Online (Sandbox Code Playgroud)

编辑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!!
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

解决方法:

  • 在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
        }
    });
    
    Run Code Online (Sandbox Code Playgroud)
  • 用来MyActivity.this代替this.

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

    public class MyActivity extends Activity implements View.OnClickListener {
    
        ....
        ....
    
        @Override
        public void onClick(View v) {
            Button newButton = Button (this)                // Will Work
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)