我有这个方法,我在每个活动中都有(这只是工作),但我可以做1个像API一样的活动,从任何活动中调用这个函数吗? 这将是一个很好的解决方案吗?而不是在每个活动中都有相同的函数?
我在一个干净的活动中设置了这个函数,并希望从任何活动中调用这个函数。在这些行中,我得到了错误。不能从静态上下文引用
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);
}
只要删除这个方法,然后添加一个带有参数的Context变量。
public static void getMyPoints(Context contex) {
.....
}
这样你就可以用context来代替这个变量 你的代码将是:
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
}
}
在函数中加入这两个参数
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
.如果没有,那也没问题。
如果想使用它,你可以用应用程序的上下文来替换上下文(this)。
public static void getMyPoints(Context context)
除此以外,你还可以创建一个基本的Activity,然后其他Activity扩展它,该方法可以在每个子类Activity中使用。
class BaseActivity {
public void getMyPoints(){
....
}
}
class SubActivity extend BaseActivty{
public void doSomething(){
getMyPoints();
}
}