我在每个活动中都有这种方法(它只是有效(,但是我可以像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();
}
}