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

时间:2013-08-14 19:38:49

标签: android callback android-asynctask android-context

标题几乎说明了一切。如果你有一个从一个类到另一个类的回调,并且需要在回调中调用一些需要上下文的方法,那么正确使用的上下文是什么?一个常见示例是AsyncTask,其中包含使用它的ActivityFragment的回调。

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

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

2 个答案:

答案 0 :(得分:8)

使用活动的上下文。例如:

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
        }
    }
    

答案 1 :(得分:0)

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

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

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

可能会给你一些建议,可能没什么:)