getApplicationContext() вне onCreate для загрузки изображения

Я хочу загрузить изображение на сервер. Но мне нужно отправить с ним имя пользователя от пользователя, отправляющего изображение.

У меня есть запись имени пользователя в SharedPreferences, поэтому я думаю, что смогу ее получить:

public class UploadRequest extends StringRequest {
    private static final String REGISTER_REQUEST_URL = "http://160.128.0.10/up.php";
    private Map<String, String> params;

    public UploadRequest(String image, String name, Response.Listener<String> listener){
        super(Method.POST, REGISTER_REQUEST_URL, listener, null);

        SharedPreferences pref = getApplicationContext().getSharedPreferences("pref01", MODE_PRIVATE); 
// CANNOT RESOLVE SYMBOL getApplicationContext
        String user = pref.getString("username", null);

        params = new HashMap<>();
        params.put("image",image);
        params.put("name",name);
    }

    @Override
    public Map<String, String> getParams() {
        return params;
    }
}

это неправильно? как я могу получить это имя пользователя?


person RGS    schedule 20.02.2017    source источник
comment
getApplicationContext() — это функция. Вы должны вызвать его для объекта, у которого есть эта функция. Поэтому вам нужно вызвать его в другом контексте. Реальное решение здесь заключается в том, что вам нужно будет передать контекст вашему конструктору.   -  person Gabe Sechan    schedule 20.02.2017
comment
Вы можете взять контекст в качестве параметра конструктора.   -  person pRaNaY    schedule 20.02.2017


Ответы (3)


Что вам нужно сделать, так это просто передать контекст основного действия этому классу его конструктором. Итак, создайте конструктор как:

public UploadRequest(Context context, String image, String name, Response.Listener<String> listener){
    super(Method.POST, REGISTER_REQUEST_URL, listener, null);

    SharedPreferences pref = context.getSharedPreferences("pref01", MODE_PRIVATE); 
// CANNOT RESOLVE SYMBOL getApplicationContext
    String user = pref.getString("username", null);

    params = new HashMap<>();
    params.put("image",image);
    params.put("name",name);
}

И когда вы инициализируете его из своей активности, передайте аргумент this в качестве контекста активности. Что-то вроде этого:

UploadRequest ur = new UploadRequest(this, OTHER_PARAMETERS_HERE);

Как упоминалось в комментариях других, ваш код не работает, потому что getApplicationContext() - это функция, и вы можете вызывать ее тогда и только тогда, когда эта функция определена для объекта.

person Kaushal28    schedule 20.02.2017

getApplicationContext() можно вызывать только из подкласса Context. из них, поэтому вы можете вызвать getApplicationContext() из своей деятельности.

Что вам нужно сделать, так это либо инициализировать глобальный Context в вашем классе приложения (не рекомендуется), либо передать Context в качестве параметра этому классу.

person Josh Laird    schedule 20.02.2017

Вам не разрешено так легко использовать getApplicationContext() в любом месте Android. так что ошибка совершенно в порядке с точки зрения Android.

Не используйте контекстные ссылки где-либо, в основном в случае сетевых вызовов. Много раз контексты привязаны к Ui (Activity). Вы столкнетесь с трудными временами NullPointersExpetions.

Решение :

Передайте свое имя пользователя в качестве параметра.

public class UploadRequest extends StringRequest {
private static final String REGISTER_REQUEST_URL = "http://160.128.0.10/up.php";
private Map<String, String> params;

public UploadRequest(String image, String usernName,String name, Response.Listener<String> listener){
    super(Method.POST, REGISTER_REQUEST_URL, listener, null);

    SharedPreferences pref = getApplicationContext().getSharedPreferences("pref01", MODE_PRIVATE); 
// CANNOT RESOLVE SYMBOL getApplicationContext
    String user = pref.getString("username", null);

    params = new HashMap<>();
    params.put("image",image);
    params.put("name",name);
}

@Override
public Map<String, String> getParams() {
    return params;
}
}
person Sush    schedule 20.02.2017