onCreate 之外的 getApplicationContext() 上传图片

getApplicationContext() outside onCreate to upload an image

我想上传一张图片到服务器。但是我需要发送发送图像的用户的用户名。

我在 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;
    }
}

错了吗?我怎样才能得到这个用户名?

getApplicationContext() 只能从 Context 的子 class 调用,Activity 是其中之一,这就是为什么您可以从 getApplicationContext() 调用你的 Activity.

您需要做的是在您的应用程序 class 中初始化全局 Context(不推荐)或将 Context 作为参数传递给此 class.

你需要做的是,通过其构造函数将 main activity 的上下文传递给此 class。因此,创建构造函数为:

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

当您从 activity 初始化它时,将 this 参数作为 activity 的上下文传递。像这样:

UploadRequest ur = new UploadRequest(this, OTHER_PARAMETERS_HERE);

正如其他人在评论中提到的,您的代码无法正常工作,因为 getApplicationContext() 是一个函数,当且仅当对象定义了该函数时,您才可以调用它。

不允许您在 android 的任何地方如此轻易地使用 getApplicationContext()。所以从 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;
}
}