代码之家  ›  专栏  ›  技术社区  ›  Victor G

Android访问类内无上下文的原始文件(非活动)

  •  0
  • Victor G  · 技术社区  · 11 年前

    我的Activity.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?

    2 回复  |  直到 11 年前
        1
  •  1
  •   CommonsWare    11 年前

    如何在不使用getApplicationContext()的情况下通过InputStream访问原始文件?

    首先,你不需要 getApplicationContext() 在现有代码中。删除它可以很好地工作,并且可以节省不必要的通话。

    除此之外——假设你 真正地 想想看 ArrayList 应负责I/O-- MyArrayList 需要您输入以下内容之一:

    • 这个 InputStream

    • 这个 Resources (所以你可以打电话 openRawResource() 在其上),或

    • 一个合适的 Context (所以你可以打电话 getResources() 取决于 我的阵列列表 ,可能是 several possible objects )

        2
  •  0
  •   Umesh Chauhan    11 年前

    没有当前应用上下文,您无法访问应用资源。如果您想在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;
    }
    }
    }
    

    在上面的代码中,使变量成为静态的,因为我们的函数是静态的。 要从Activity类调用它,只需调用

    Type "whateverYouWhatToGetFromFunction" = Demo.f1(this, ...);