简体   繁体   English

如何获取模块中没有应用程序类的非活动类的上下文

[英]How to get context of a non activity class with no Application Class in a module

I am trying to get the context to use in sharedprefs in a module of my app.我正在尝试获取要在我的应用程序模块中的 sharedprefs 中使用的上下文。 The module doesn't have any Activity class extended nor does the Application Class.该模块没有扩展任何 Activity 类,也没有扩展应用程序类。 Below is the code:下面是代码:

public class GetMovieCreditsUseCase extends BaseUseCase {
public static String director = "";
public static boolean loaded = false;


public interface GetMovieCreditsUseCaseCallback extends BaseUseCaseCallback {
    void onImagesUrlsLoaded(List<ImageEntity> backdrops, List<ImageEntity> posters);
}

private String apiKey;
private int movieID;

public GetMovieCreditsUseCase(String apiKey, int movieID, GetMovieCreditsUseCaseCallback callback) {
    super(callback);
    this.movieID = movieID;
    this.apiKey = apiKey;
}


@Override
public void onRun() throws Throwable {
    API.http().movieDirectors(apiKey, movieID, new Callback<GetMovieCreditsResponse>() {
        @Override
        public void success(GetMovieCreditsResponse getMovieCreditsResponse, Response response) {
            ((GetMovieCreditsUseCaseCallback) callback).onImagesUrlsLoaded(getMovieCreditsResponse.getBackdrops(), getMovieCreditsResponse.getPosters());

            String json = new Gson().toJson(getMovieCreditsResponse);
            loaded = false;
            JSONObject jsonObj = null;
            try {
                jsonObj = new JSONObject(json);
            } catch (JSONException e) {
                e.printStackTrace();
            }

            JSONArray c = null;
            try {
                c = jsonObj.getJSONArray("crew");
            } catch (JSONException e) {
                e.printStackTrace();
            }
            for (int i = 0; i < c.length(); i++) {
                JSONObject obj = null;
                try {
                    obj = c.getJSONObject(i);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                String A = null;
                String B = null;
                try {

                    A = obj.getString("name");
                    B = obj.getString("job");

                } catch (JSONException e) {
                    e.printStackTrace();
                }
                if (B.equals("Director")) {
                    Log.d("Director", "Director is " + A);
                    director = A;
                    loaded = true;

//getSharedPreferences throws error as cannotResolveMethod
                        SharedPreferences prefs = getSharedPreferences("director", Context.MODE_PRIVATE);

                    prefs.registerOnSharedPreferenceChangeListener(
                            new SharedPreferences.OnSharedPreferenceChangeListener() {
                                public void onSharedPreferenceChanged(
                                        SharedPreferences prefs, String key) {
                                    System.out.println(key);
                                }
                            });



                    break;
                }
                System.out.println(A);
            }

            Log.d("Directing", json);


        }

        @Override
        public void failure(RetrofitError error) {
            if (error.getKind() == RetrofitError.Kind.NETWORK) {
                errorReason = NETWORK_ERROR;
            } else {
                errorReason = error.getResponse().getReason();
            }
            onCancel();
        }
    });
}
}

I tried different solutions but to no avail.我尝试了不同的解决方案,但无济于事。 getApplicationContext, getActivity, this or MyApplication.getContext() none of them worked(all throwing error) getApplicationContext, getActivity, this 或 MyApplication.getContext() 他们都没有工作(都抛出错误)

As I commented in comments, you can do this :正如我在评论中评论的那样,您可以这样做:

private String apiKey;
private int movieID;
private Context mContext;

public GetMovieCreditsUseCase(String apiKey, int movieID, GetMovieCreditsUseCaseCallback callback, Context context) {
    super(callback);
    this.movieID = movieID;
    this.apiKey = apiKey;
    this.mContext = context;
}

Then you can use :然后你可以使用:

SharedPreferences prefs = this.mContext.getSharedPreferences("director", Context.MODE_PRIVATE);

But I strongly recommend to you take a look on Dagger 2 to resolve this issues.但我强烈建议你看看Dagger 2来解决这个问题。

Option 1: Pass context through constructor选项 1:通过构造函数传递上下文

public class GetMovieCreditsUseCase extends BaseUseCase {
    private Context mContext;
    public GetMovieCreditsUseCase(Context context, String apiKey, int movieID,GetMovieCreditsUseCaseCallback callback) {
        super(callback);
        this.mContext = context;
        this.movieID = movieID;
        this.apiKey = apiKey;
    }
}

Option 2: Define your own Application class选项 2:定义您自己的应用程序类

AndroidManifest.xml AndroidManifest.xml

<application
        android:name=".application.MyApplication"
        ....

MyApplication.java我的应用程序

public class MyApplication extends Application {

    private static MyApplication mInstance;

    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
    }

    public static Context getAppContext() {
        return mInstance.getApplicationContext();
    }
}

Then call MyApplication.getAppContext()然后调用 MyApplication.getAppContext()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM