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

时间:2019-01-15 08:33:23

标签: android module android-context android-module

我正在尝试让上下文在我的应用程序模块中的sharedprefs中使用。该模块没有扩展任何Activity类,也没有Application类。 下面是代码:

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

我尝试了其他解决方案,但无济于事。 getApplicationContext,getActivity,this或MyApplication.getContext()都不起作用(全部抛出错误)

2 个答案:

答案 0 :(得分:0)

正如我在评论中评论的那样,您可以执行以下操作:

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

然后您可以使用:

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

但是我强烈建议您查看Dagger 2来解决此问题。

答案 1 :(得分:0)

  

选项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;
    }
}
  

选项2:定义自己的应用程序类

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

然后调用MyApplication.getAppContext()