使方法静态并从任何活动中调用

所以我有在每个活动中都可以使用的这种方法(它可以正常工作),但是我可以像API那样进行1个活动并从任何活动中调用此函数吗?这将是一个好的解决方案吗?而是在每个活动中都具有相同的功能?

我在一个干净的活动中具有此功能,并且想从任何活动中调用此功能。突出显示的代码是我得到的错误; “无法从静态上下文中引用”

希望看到一些建议,在此先感谢。

    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);
    }
评论
  • 没人疼孩子
    没人疼孩子 回复

    Firstly, I will explain the reason. according to the class loader mechanism. the static variable and method which is load when compile. but the instantiation object, in the current situation; it is this. it is created when the program runs. so you can not directly use it.

    其次,有一些解决方案。您可以通过方法参数来传递它。但您应该注意内存泄漏。

    public static void getMyPoints(Context context)
    
    

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

    class BaseActivity {
      public void getMyPoints(){ 
        ....
      }
    }
    
    class SubActivity extend BaseActivty{
    
       public void doSomething(){
           getMyPoints();
       }
    
    }
    
    
    
    
    
  • avelit
    avelit 回复

    您可以从以下界面使用: 最好将您的应用数据逻辑分开,最好使用接口来查看。 是否可以测试和清洁

    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());
    
    }
    
  • ???
    ??? 回复

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

    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())