Как получить контекст неактивного класса без класса приложения в модуле - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь получить контекст для использования в 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 голосов
/ 15 января 2019

Вариант 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 ()

0 голосов
/ 15 января 2019

Как я прокомментировал в комментариях, вы можете сделать это:

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 для решения этой проблемы.

...