android,使用 getApplicationContext() 自定义 class

android, custom class with getApplicationContext()

我正在开发一个使用大量网络请求进行数据检索的应用程序。 网络请求当前为 URLConnection,带有 HttpsURLConnection

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


像这样的东西行得通吗:

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

Can i pass the context as a parameter when i instantiate it?

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

第一种方式:

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

Context myCon;

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

并且您可以在 Activity 中访问

myClass mc=new myClass(Activity.this);

第二种方式:

通过直接传递给自定义 class 方法

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

在您的一项活动中(主要 activity 更好)声明此

public static Context context;

在你的 oncreate 添加这个

 context=getApplicationContext();

而在其他 类 中只需使用

MainActivity.context

这对我有用

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

为防止出现这种情况,请避免像其他帖子中提到的那样对您的 activity 进行强引用,并使用弱引用。确保始终检查弱引用的 return 值是否为 null。

示例:

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

}