2016-05-06 12 views
1

Android上のシングルトン(アクティビティではない)からres/rawフォルダ内のファイルにアクセスするにはどうすればよいですか? 私が試してみた:Androidでファイルの場所を取得するためのシングルトン

ので、動作しません
InputStream is = MainActivity.getResources().openRawResource("data.json"); 

「(非静的メソッドgetResouces)は、静的なコンテンツから参照することはできません」。 私も試してみた:

 URL fileURL = getClass().getClassLoader().getResource(R.raw.data); 
    String filePath = fileURL.getPath(); 

ヌル・ポインタ例外をスローしています。

私のシングルトン:私は、ファイルを取得したい

public class CoursesDataManager { 

private static CoursesDataManager instance; 

private final List<Course> courses; 

public static CoursesDataManager getInstance() { 
    if (instance == null) 
     instance = new CoursesDataManager(); 
    return instance; 
} 

private CoursesDataManager() { 
    courses = parseCourses(**filePath/inputStream**); 
} 

理由は変化しないとアクセスできるように決して私が私のシングルトンは、一度そのファイル内のデータを解析し、このデータを格納し、このデータを持つようにしたいということです私のアプリケーションの生涯を通して。

ありがとうございます。

+0

あなたの非活動クラスには文脈が必要です。 – Raghunandan

+0

それはどういう意味ですか?それはシングルトンなので、私はそれにパラメータを渡すことはできません。 –

+0

http://developer.android.com/reference/android/content/Context.html#getResources()これをチェックして。 – Raghunandan

答えて

1

リソースにアクセスするにはコンテキストが必要です。この目的のためにアプリケーションコンテキストを使用することができます。アプリケーションをサブクラス化し、コンテキストを静的変数に保存します。シングルトン内のコンテキストを使用します。

InputStream is = MyApplication.context.getResources().openRawResource("data.json"); 

:シングルトンで、このコンテキストを使用して、今すぐ

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

:アプリケーションクラスの名前を指定し、マニフェストで

public class MyApplication extends Application { 
    public static MyApplication context = null; 

    public void onCreate() { 
     super.onCreate(); 
     context = this; 
    } 
} 

Applicationクラスを作成します。注:このメソッドは、アクティビティの外からシングルトンインスタンスを作成する場合でも使用できますあなたはアクティビティコンテキストを持っていません。

0

あなたのクラスにコンテキストを追加し、そのような何かのように変更します。

public class CoursesDataManager { 

private static CoursesDataManager instance; 
private Context context; 

private final List<Course> courses; 

public static CoursesDataManager getInstance(Context context) { 
    if (instance == null) 
     instance = new CoursesDataManager(context.getApplicationContext()); 
    return instance; 
} 

private CoursesDataManager(Context context) { 
    this.context = context; 
    courses = parseCourses(**filePath/inputStream**); 
} 
0
public class CoursesDataManager { 

private static CoursesDataManager instance; 
private static Context mContext; 
private final List<Course> courses; 

public static CoursesDataManager getInstance(Context context) { 

if (instance == null) 
{ 
    instance = new CoursesDataManager(); 
} 
    mContext = context; 
    return instance; 
} 

private CoursesDataManager() { 
    courses = parseCourses(**filePath/inputStream**); 
} 

mContext.getResources().openRawResource(resourceId); 
3
public class CoursesDataManager { 

private static CoursesDataManager instance; 

private final List<String> courses; 

public static CoursesDataManager getInstance(Context context) { 
    if (instance == null) 
     instance = new CoursesDataManager(context); 
    return instance; 
} 

    private CoursesDataManager(Context context) { 
     courses =context.getResources().openRawResource(R.raw.filename); 

    } 
} 

アクティビティ

からそれを呼び出すようにあなたがここからリソースを使用することができます
CoursesDataManager.getInstance(getApplicationContext()); 
関連する問題