6

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

4

3 回答 3

8
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);
  }
}
于 2010-11-08T17:52:36.543 回答
2

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

没有活动的Android Context?和其他无活动编程?

public class MyApplication extends Application {
    private static MyApplication instance;

    public MyApplication() {
        instance = this;
    }

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

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

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

现在您可以MyApplication.getInstance().getAssets()从任何地方进行静态调用。

或者,您可以使用Dagger依赖注入将一个Application直接注入您的对象。(注入Application上下文有点棘手。请参阅Dagger 2 injectioning Android Context这个问题在 Danger github repo 上提交。)

于 2019-04-20T23:27:40.983 回答
0

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

于 2017-06-23T15:33:38.047 回答