myActivity.class中有代码
InputStream inputStream = getApplicationContext().getResources().openRawResource(R.raw.text);
BufferedReader buff = new BufferedReader(new InputStreamReader(inputStream));
String s;
ArrayList <String> list = new ArrayList <String>();
try
{ while((s = buff.readLine()) != null)
{
list.add(s);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
我想将这部分代码移到单独的java.class中,但在这里我遇到了一个问题,如何在不使用getApplicationContext()的情况下通过InputStream访问原始文件?
例如:
public class MyArrayList extends ArrayList<String>
{
private InputStream in = ???; // how to declare InpuStream without Context???
private BufferedReader buff = new BufferedReader(new InputStreamReader(in));;
private String s;
private MyArrayList array;
public MyArrayList ()
{
try
{
while ((s = buff.readLine()) != null)
{
array.add(s);
}
} catch (IOException e)
{
e.printStackTrace();
} finally
{
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
我试过了
InputStream in = Resources.getSystem().openRawResource(R.raw.text);
但它给了我NullPointerException
所以我的问题是:是否存在某些方法来使用Activity之外的原始文件初始化InputStream?
答案 0 :(得分:1)
如何在不使用getApplicationContext()的情况下通过InputStream访问原始文件?
首先,您现有代码中不需要getApplicationContext()
。删除它将工作得很好,它可以节省不必要的电话。
除此之外 - 并且假设您确实认为ArrayList
应该对I / O负责 - MyArrayList
需要您传递以下其中一项:
InputStream
或
Resources
(因此您可以在其上调用openRawResource()
)或
合适的Context
(因此您可以在其上调用getResources()
)(根据MyArrayList
的有效期,可以是several possible objects之一)
答案 1 :(得分:0)
如果没有当前的应用上下文,您将无法访问App资源。如果你想在diff Java文件中移动代码,只需创建一个类并在该类中创建一个带有activity的函数作为函数的参数和所需的返回类型之一。 由于活动是上下文的父级,我们可以在需要活动或上下文引用的地方使用它。
public class Demo{
public static "whatEverReturnTypeYouNeedToReturnFromFunction" f1(Activity act, ...){
InputStream inputStream = act.getResources().openRawResource(R.raw.text);
BufferedReader buff = new BufferedReader(new InputStreamReader(inputStream));
String s;
ArrayList <String> list = new ArrayList <String>();
try
{ while((s = buff.readLine()) != null)
{
list.add(s);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
return whatEverReturnTypeYouNeedToReturnFromFunction;
}
}
}
在上面的代码中,make变量是静态的,因为我们的函数是静态的。 要从Activity类中调用它,只需调用
即可Type "whateverYouWhatToGetFromFunction" = Demo.f1(this, ...);