我需要能够从应用程序的主要活动之外调用readAsset。我听说有人提到需要传递Context,但语言一直很模糊。有人可以描述添加将readAsset调用到不是主要活动的现有类的能力所需的步骤吗?在主活动中创建一个公共函数,并让其他调用不能作为我需要添加readAsset的地方,在一个单独的线程中。
答案 0 :(得分:7)
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);
}
}
答案 1 :(得分:0)
请注意,所有文件系统访问都应该在主线程上完成,因此在onCreate()期间不应该读取它们。相反,你应该使用另一个线程,例如由AysncTask提供。
答案 2 :(得分:0)
要读取资产,您需要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
属性添加到<application>
中的AndroidManifest.xml
元素中:
<application android:name="com.example.MyApplication" ... />
现在您可以从任何地方静态呼叫MyApplication.getInstance().getAssets()
。
或者,您可以使用Dagger依赖项注入将Application
直接注入到对象中。 (注入Application
上下文有点棘手。请参见Dagger 2 injecting Android Context和this issue filed on the Danger github repo。)