一个静态方法的问题。"不能从静态上下文中引用"

问题描述 投票:0回答:1

我有这个方法,我在每个活动中都有(这只是工作),但我可以做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);
    }
java android function android-activity static
1个回答
1
投票

只要删除这个方法,然后添加一个带有参数的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())


0
投票

你可以使用下面这样的界面:最好将你的应用程序的数据逻辑和视图分开,最好是使用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
      }

}

0
投票

在函数中加入这两个参数

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

}

0
投票

首先,我解释一下原因 根据类加载器的机制,编译时加载的是静态变量和方法,但实例化对象,在目前的情况下;它是... ... 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();
   }

}




© www.soinside.com 2019 - 2024. All rights reserved.