android,自定义类与getApplicationContext()

时间:2015-04-23 12:28:08

标签: java android android-asynctask

开发一个使用大量网络请求进行数据检索的应用。 网络请求目前为URLConnectionHttpsURLConnection

问题我得到的是我多次拨打getApplicationContext()。这在我在活动类中声明类之前已经很好了,但是我希望在一个单独的类中声明AsyncTask,以便在需要时导入到活动类。我假设我不能从自定义类getApplicationContext(),因为它没有扩展活动。我该如何解决这个问题?我可以在实例化时将上下文作为参数传递吗?

<小时/> 会像这样的工作:

Context contxt = getApplicationContext();
CustomClass custmClass = new CustomClass();
ArrayList<Object> parameters = new ArrayList<Object>();
parameters.add(contxt);
...
custmClass.execute(parameters);

CustomClass extends AsyncTask<ArrayList<Object>, Void, Boolean>

3 个答案:

答案 0 :(得分:4)

正如其他答案所述,您应该将上下文作为参数传递给AsyncTask。 尽管如此,如果你在AsyncTask执行时关闭你的活动并使用这个引用,你可能会遇到很多问题,这将导致异常。

为防止出现这种情况,请避免对其他帖子中提到的活动进行强烈引用,并使用弱引用。确保始终检查弱引用的返回值是否为空。

示例:

import com.example.MyActivity;

public class MyTask {

    private final WeakReference<MyActivity> myActivity;

    public MyTask(MyActivity myActivity) {
        this.myActivity = new WeakReference<MyActivity>(myActivity);
    }

    private AsyncTask<String, Integer, Integer> createAsyncTask() {
        return new AsyncTask<String, Integer, Integer>() {

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                // prepare execution
            }

            @Override
            protected Integer doInBackground(String... params) {
                // code
                return 0;
            }

            @Override
            protected void onPostExecute(Integer result) {
                if (myActivity.get() != null && !myActivity.get().isFinishing()) {
                    // do something
                }
            }
        };
    }

}

答案 1 :(得分:1)

在你的一个活动中(主要活动更好)声明这个

public static Context context;
你的oncreate中的

添加了这个

 context=getApplicationContext();

在其他课程中只需使用

MainActivity.context

这对我有用

答案 2 :(得分:0)

  

我可以在实例化时将上下文作为参数传递吗?

是。您可以将当前Context作为参数传递给自定义类。

第一道:

在自定义类中创建单个参数构造函数

Context myCon;

public myClass(Context mCon){
 this.myCon=mCon;
}

您可以在Activity中访问

myClass mc=new myClass(Activity.this);

第二种方式:

直接传递给Custom类方法

public void getCount(Context mCon){
 //Directly used mCon here
}

当前解决方案:

Context contxt = getApplicationContext();
CustomClass custmClass = new CustomClass(contxt);
ArrayList<Object> parameters = new ArrayList<Object>();
parameters.add(contxt);
...
custmClass.execute(parameters);