2016-05-06 5 views
1

Как я могу получить доступ к файлу в моей папке res/raw из Singleton (а не активности) на Android? Я пробовал:Singleton, чтобы получить местоположение файла на Android

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

, который не работает, так как «не-статические getResouces() метод не может ссылаться от статического контента». Я также попытался:

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

, который бросает исключение нулевого указателя.

Мои Singleton:

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**); 
} 

Поэтому я хочу, чтобы получить файл в том, что я хочу, чтобы мой Singleton для анализа данных в этом файле один раз, хранить эти данные, и есть эти данные никогда не меняются и быть доступными на протяжении всей моей заявки.

Большое спасибо.

+0

Вам нужен контекст в вашем классе без активности. – Raghunandan

+0

Что это значит? Я не могу передать какие-либо параметры, так как это синглтон. –

+0

http://developer.android.com/reference/android/content/Context.html#getResources(). Проверь это. – Raghunandan

ответ

1

Для доступа к ресурсам необходим контекст. Для этой цели можно использовать контекст приложения. Подкласс вашего приложения, сохраните контекст в статической переменной. Используйте контекст внутри singleton.

Создание класса Application:

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

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

В манифесте, указать имя класса Application:

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

Теперь используйте этот контекст в одноточечном:

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

Примечание. Вы можете использовать этот метод, даже если вы создаете экземпляр singleton извне Activity , где у вас нет контекста активности.

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()); 
Смежные вопросы