如何在静态方法中获取上下文(Context)

5

我在使用静态方法时初始化一个新对象遇到了问题,我有如下的数据库类。

public class LatLogDBAdapter {   
 private final Context mCtx;     
 private DatabaseHelper mDbHelper;
 private SQLiteDatabase mDb;

 private static class DatabaseHelper extends SQLiteOpenHelper {

      DatabaseHelper(Context context) {
          super(context, DATABASE_NAME, null, DATABASE_VERSION);
      }


      @Override
      public void onCreate(SQLiteDatabase db) {
       Log.w(TAG, DATABASE_CREATE);
       db.execSQL(DATABASE_CREATE);
      }      
     }

我在另一个类中有一个静态方法,在这个静态方法中,我想要使用这个Context来初始化DatabaseHelper,但是会出现"无法在静态上下文中使用this"的错误。

我的静态方法如下所示:

 public class DetailMapView extends FragmentActivity {
            public static void updateLocation(String number, String LatLong){
                 LatLogDBAdapter dbHelper = new LatLogDBAdapter(this);

           }

    }

如何避免"无法在静态上下文中使用此项"错误。


也许尝试使用getApplicationContext()而不是this。 - Shobhit Puri
是的,通常在使用DatabaseHelper时使用getApplicationContext是很好的选择,但调用该函数需要已经访问上下文。在这种情况下(在他的静态函数中),他没有访问上下文。 - Tom
^ 好的。现在明白了。只是好奇,获取上下文的其他方法有哪些? - Shobhit Puri
@ShobhitPuri 我在下面的答案中添加了更多内容,回答了你的问题。 - Tom
2个回答

16
public class DetailMapView extends FragmentActivity {
        public static void updateLocation(Context context, String number, String LatLong){
             LatLogDBAdapter dbHelper = new LatLogDBAdapter(context);

       }

}
将一个Context作为参数添加到您的静态方法中,并在调用该方法时传递它。

如果想要从另一个独立类的方法中调用updateLocation(),该怎么做呢?这个类是public class SMSReceiver extends BroadcastReceiver { }。 - Bryanyan
从SMSReceiver类中,我可以像这样调用DetailMapView.updateLocation(context, tel, msg)吗? - Bryanyan
什么是背后的逻辑?我在哪里可以找到相关信息? - Bryanyan
2
这是一个非常常见的概念。为了保持static方法无状态,暗示着任何状态(例如上下文、数字等)都必须作为参数传入。 - edthethird
这听起来很合理。谢谢! :) 我觉得我现在更好地理解了Android的工作原理...(甚至完整的面向对象编程概念对我来说似乎更清晰了) - Martin Pfeffer
天啊,我感觉自己是个白痴!!这么简单而且合理的解决方案,我居然没想到! - MareCieco

0

你的函数 'updateLocation' 是静态的。这意味着它没有与之关联的实例,因此也没有'this'。

你需要找到另一种方法来获取数据库帮助类的上下文。

编辑:个人而言,我觉得将上下文传递给许多不同的函数很麻烦。在活动中,您只需使用活动作为上下文,但在许多情况下(例如此处的数据库),您将想要使用应用程序上下文。对于此,我发现这种方法很有帮助:
在Android上获取“Context”的静态方式?


是的,我是Android的新手,对于Context不是很清楚。有没有关于Context的好文章可以推荐一下? - Bryanyan
我添加了一些关于如何处理应用程序上下文的内容。 - Tom
请查看此链接:http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html。在Android中保持对上下文的静态引用,除非您非常小心,否则不是一个好主意。 - edthethird
1
这是关于内存泄漏的危险,特别是当您持有活动上下文时。在这种情况下,我们正在谈论持有(和访问)应用程序上下文 - 我认为问题是不同的。 - Tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接