【问题标题】:Problem with a static method: "cannot be referenced from a static context"静态方法的问题:“无法从静态上下文中引用”
【发布时间】:2020-05-11 09:57:23
【问题描述】:

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

【问题讨论】:

    标签: java android function android-activity static


    【解决方案1】:

    只需删除它并添加一个带参数的 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())



    【讨论】:

      【解决方案2】:

      您可以从如下界面使用:
      最好将您的应用程序数据逻辑和视图分开使用接口。 它是否可测试且干净

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

      【讨论】:

        【解决方案3】:

        将这两个参数添加到函数中:

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

        【讨论】:

          【解决方案4】:

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

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

          如果想使用它,你可以替换上下文(this)使用应用程序上下文。

          public static void getMyPoints(Context context)
          
          

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-12-31
            • 1970-01-01
            • 1970-01-01
            • 2015-10-21
            相关资源
            最近更新 更多