静态方法的问题:"cannot be referenced from a static context"



我在每个活动中都有这种方法(它只是有效(,但是我可以像API一样创建一个1活动并从任何活动调用此函数吗? 这将是一个很好的解决方案吗?而不是在每个活动中都有相同的功能?

我在干净的活动中有这个函数,并希望从任何活动调用这个函数。 在这些行中,我得到错误:无法从静态上下文引用

final String email = SharedPrefManager.getInstance(this).getUserEmail();
final TextView bottom_bar_points = findViewById(R.id.bottom_bar_points);
...
MySingleton.getmInstance(this).addToRequestQueue(request);

我很想看到一些建议,提前谢谢。

法典

public static void getMyPoints() {
final String email = SharedPrefManager.getInstance(this).getUserEmail();
final TextView bottom_bar_points = findViewById(R.id.bottom_bar_points);
String uRl = "https://mywebsite.com/getmypoints.php";
StringRequest request = new StringRequest(Request.Method.POST, uRl, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
if (response.equals("Found")) {
bottom_bar_points.setText(response);
return;
} else {
bottom_bar_points.setText(response);
return;
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
bottom_bar_points.setError(error.toString());
return;
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
HashMap<String, String> param = new HashMap<>();
param.put("email", email);
return param;
}
};
request.setRetryPolicy(new DefaultRetryPolicy(30000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
MySingleton.getmInstance(this).addToRequestQueue(request);
}

只需删除它并添加一个带有参数的上下文变量:



public static void getMyPoints(Context contex) {
.....
}

所以你用上下文替换它。您的代码将是:



public static void getMyPoints(Context context) {
final String email = SharedPrefManager.getInstance(context).getUserEmail();
final TextView bottom_bar_points = **findViewById**(R.id.bottom_bar_points);
String uRl = "https://mywebsite.com/getmypoints.php";
StringRequest request = new StringRequest(Request.Method.POST, uRl, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
if (response.equals("Found")) {
bottom_bar_points.setText(response);
return;
} else {
bottom_bar_points.setText(response);
return;
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
bottom_bar_points.setError(error.toString());
return;
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
HashMap<String, String> param = new HashMap<>();
param.put("email", email);
return param;
}
};
request.setRetryPolicy(new DefaultRetryPolicy(30000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
MySingleton.getmInstance(context).addToRequestQueue(request);

}



在活动中,使用以下命令调用此方法:



Activity.getMyPoints(getBaseContext(((



你可以从界面使用,如下所示:
最好分离你的应用程序数据逻辑,查看最好是使用inteface。 做是可测试且干净的

public class GetFromServer{
private OnGetDataListener listener;
public getData(){
String uRl = "https://mywebsite.com/getmypoints.php";
StringRequest request = new StringRequest(Request.Method.POST, uRl, new 
Response.Listener<String>() {
@Override
public void onResponse(String response) {
listener.onGetData(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
listener.onGetData(error.toString());
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
}
};
request.setRetryPolicy(new DefaultRetryPolicy(30000, 
DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
}
public void setOnGetDataListener(OnGetDataListner listner){
this.listener=listener;
}
public interface OnGetDataListner{
void onGetData();
}
}

在"所有需要的活动"中,执行以下操作:

public Activty extends AppCompactActivty implements{
public onCreate(){
new GetFromServer().setOnGetDataListener(this);
}
public void onGetData(String response){
//here you can use from response
}
}

将以下 2 个参数添加到函数中:

Activity A {
public static void getMyPoints(Context context, View view) {
...
}
}

并更改出现错误的行,如下所示:

final String email = SharedPrefManager.getInstance(context).getUserEmail();
final TextView bottom_bar_points = view.findViewById(R.id.bottom_bar_points);
...
MySingleton.getmInstance(context).addToRequestQueue(request);

可以这样调用此方法:

Activity B {
A.getMyPoints(getApplicationContext(), getCurrentFocus());
}

首先,我将解释原因。 根据类加载器机制。 编译时加载的静态变量和方法。 而是实例化对象,在当前情况下; 它是this. 它是在程序运行时创建的。 所以你不能直接使用它。

其次,有一些解决方案。 你可以通过方法参数传递它。 但是你应该注意内存泄漏。 如果你的 SharedPrefManager 是单个对象。我不建议使用这种方式。您应该使用ApplicationContext. 如果没有,那就没问题了。

如果 WAN 使用它,您可以替换上下文(这(使用应用程序上下文。

public static void getMyPoints(Context context)

除此之外,您还可以创建一个基本活动,然后其他活动扩展它。 该方法可以在每个子类活动中使用。

class BaseActivity {
public void getMyPoints(){ 
....
}
}
class SubActivity extend BaseActivty{
public void doSomething(){
getMyPoints();
}
}


相关内容

最新更新