【问题标题】:Android How to read an asset from outside of main activityAndroid 如何从主要活动之外读取资产
【发布时间】:2011-05-06 19:09:42
【问题描述】:

我需要能够从我的应用程序的主要活动之外调用 readAsset。我听说有人提到需要传递上下文,但语言非常模糊。有人可以描述将调用 readAsset 的能力添加到不是主要活动的现有类的必要步骤吗?在主要活动中创建一个公共函数并让其他调用不起作用,因为我需要将 readAsset 添加到的地方是在一个单独的线程中。

【问题讨论】:

  • 您对将Context 传递给依赖于功能的类有何顾虑?
  • 我没有,但我还没有找到我需要做什么的示例。我想这很简单,但我只能找到模糊的描述。假设我有我的主要活动和其他一些课程(在这种情况下,在一个单独的线程中)。需要在其他类中添加什么,以便我可以在那里使用我的资产。

标签: android assets


【解决方案1】:

要读取资产,您需要Context,但您不必必须使用Activity 作为您的Context;您可以改用Application 对象。

Android Context without being in an activity? And other activity-less programming?

public class MyApplication extends Application {
    private static MyApplication instance;

    public MyApplication() {
        instance = this;
    }

    public static MyApplication getInstance() {
         return instance;
    }
}

您需要首先将android:name 属性添加到AndroidManifest.xml 中的<application> 元素:

 <application android:name="com.example.MyApplication" ... />

现在您可以从任何地方静态呼叫MyApplication.getInstance().getAssets()

或者,您可以使用Dagger 依赖注入将Application 直接注入您的对象。 (注入Application 上下文有点棘手。请参阅Dagger 2 injecting Android Contextthis issue filed on the Danger github repo。)

【讨论】:

    【解决方案2】:

    请注意,所有文件系统访问都应在主线程之外完成,因此您不应在 onCreate() 期间读取它们。相反,您应该使用另一个线程,例如由 AysncTask 提供。

    【讨论】:

      【解决方案3】:
      public class NonActivity {
          public void doStuff(Context c) {
              //read from assets
              c.getAssets();
              //use assets however
          }
      }
      

      不确定你在问什么,但也许是这样的?只需添加到现有类,并使用上下文来检索资产。在您的活动中调用如下方法:

      public class MyActivity extends Activity {
        public void OnCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
      
          NonActivity n = new NonActivity();
          n.doStuff(this);
        }
      }
      

      【讨论】:

      • 这看起来像我要求的。我今晚会试试这个。谢谢!
      • 就是这样。认为这很容易。
      • 小心传递活动的上下文。如果您将上下文传递给超过活动的线程,您可能会发生内存泄漏。
      • 这实际上没有意义,也没有回答原始问题。应该在没有任何上下文的情况下询问正确的问题“如何访问资产/资源”。假设属性文件 app.properties 包含 isLogEnabled。如何在不将上下文传递给每个记录某些内容的类的情况下访问此类全局属性。
      • @MGDeveloper 这是一个完全不同的问题。
      猜你喜欢
      • 1970-01-01
      • 2016-03-12
      • 1970-01-01
      • 2019-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-16
      相关资源
      最近更新 更多