0

Всем привет! Столкнулся с проблемой, что после newCall , пытаясь сделать startActivity, программа крашится , много чего перечитал, но решения так и не нашёл. Вот сама ошибка. Всем заранее спасибо!

E/AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher
              Process: com.example.denis.leagueoflegends, PID: 16038
              java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.ActivityThread$ApplicationThread android.app.ActivityThread.getApplicationThread()' on a null object reference
                  at android.app.Activity.startActivityForResult(Activity.java:4489)
                  at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54)
                  at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:67)
                  at android.app.Activity.startActivityForResult(Activity.java:4446)
                  at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:720)
                  at android.app.Activity.startActivity(Activity.java:4807)
                  at android.app.Activity.startActivity(Activity.java:4775)
                  at com.example.denis.leagueoflegends.choice_player.start_summoner_page(choice_player.java:204)
                  at com.example.denis.leagueoflegends.HttpGet$2.onResponse(HttpGet.java:160)
                  at okhttp3.RealCall$AsyncCall.execute(RealCall.java:153)
                  at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
                  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
                  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
                  at java.lang.Thread.run(Thread.java:764)


public class HttpGet implements HttpListener {

public OkHttpClient client = new OkHttpClient();
private HttpListener listener;
GetUrl GETURL;
GetCall GETCALL;
choice_player CHOICE;
private LocalBroadcastManager brodcast;
private Context context;
public String summoner_region;
public String summoner_id;
public String summoner_name;
public String summoner_profile_icon;
public String summoner_level;
public String summoner_solo_rank;
Intent page;
//Установка listener
//Инициализации классов

HttpGet(HttpListener listener) {
    this.listener = listener;
    GETURL = new GetUrl();
    GETCALL = new GetCall(this);
    choice_player CHOICE;
   //CHOICE = new choice_player();
}


//Запросы данных из API

public void get_summoner_id(String REGION, final String summoner_name) {
    summoner_region = REGION;
    final Request request = new Request.Builder().url(this.GETURL.get_url_summoner_by_summoner_name(summoner_name, REGION)).build();
    call_summoner_id(request);
}
public void get_summoner_name(String REGION, String summoner_id){
    final Request request = new Request.Builder().url(this.GETURL.get_url_summoner_by_id(summoner_id, REGION)).build();
    call_summoner_name(request);
}

public void check_id(){
    if (this.summoner_id != null && !this.summoner_id.isEmpty()) {
        CHOICE.start_page();
    } else {
        CHOICE.error_summoner(404);
    }
}



public void set_summoner_id(String value) {
    this.summoner_id = value;
    CHOICE.summoner_id = value;
}



public void set_summoner_name(String value) {

    this.summoner_name = value;
}


public void check_summoner(String region, String summoner_name_value) {
    get_summoner_id(region, summoner_name_value);
}




public void call_summoner_id(Request request){
    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            e.printStackTrace();
            listener.onFailure();
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            try {
                Response response_summoner = response;
                System.out.print(response_summoner);
                JSONObject json = new JSONObject(response_summoner.body().string());
                final String new_summoner_id = json.getString("id");
                summoner_id = new_summoner_id;
                check_id();
            //set_summoner_id(new_summoner_id);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    });
}

public void call_summoner_name(Request request){
    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            e.printStackTrace();
            listener.onFailure();
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            try {
                Response response_summoner = response;
                System.out.print(response_summoner);
                JSONObject json = new JSONObject(response_summoner.body().string());
                final String new_summoner_name = json.getString("name");
                set_summoner_name(new_summoner_name);
            //CHOICE.set_summoner_intent("name", new_summoner_name);
                CHOICE.start_summoner_page(CHOICE.summoner_pagee);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    });
}


public void get_champrion_by_id(String champion_id, String REGION) {
    final Request request_champion = new Request.Builder().url(this.GETURL.get_url_champion_by_champion_id(champion_id, REGION)).build();
}

public void SetResponse(String response) throws JSONException {
    listener.onSuccess(response);
}

private void sendMessage() {
    Log.d("sender", "Broadcasting message");
    Intent intent = new Intent("summoner_id");
    System.out.print(intent + "this is id of summoner");
    // You can also include some extra data.
    intent.putExtra("message", "This is my message!");
    LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
}

@Override
public void onSuccess(String response) throws JSONException {

}

@Override
public void onFailure() {

}
}

 public class choice_player extends AppCompatActivity implements 
 View.OnClickListener, HttpListener {

HttpGet GETAPI;
GetCall GETCALL;
GetUrl GetUrl;
ImageView ru;
ImageView euw;
ImageView eun;
ImageView na;
ImageView search;
EditText summoner_name_input;
String region;
String summoner_id;
String summoner_name;
TextView error_text;
Intent summoner_pagee;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_choice_player);
    region = "";
    GETAPI = new HttpGet(this);
    GetUrl = new GetUrl();
    GETCALL = new GetCall(this);
    error_text = (TextView) findViewById(R.id.error_text);
    ru = (ImageView) findViewById(R.id.ru);
    euw = (ImageView) findViewById(R.id.euw);
    eun = (ImageView) findViewById(R.id.eun);
    na = (ImageView) findViewById(R.id.na);
    search = (ImageView) findViewById(R.id.search);
    summoner_name_input = (EditText) findViewById(R.id.summoner_name);
    summoner_name_input.setOnClickListener(this);
    search.setOnClickListener(this);
    ru.setOnClickListener(this);
    euw.setOnClickListener(this);
    eun.setOnClickListener(this);
    na.setOnClickListener(this);
    summoner_pagee = new Intent(getApplicationContext(), summoner_page.class);
}

@Override
public void onClick(View view) {
    switch (view.getId()) {
        case R.id.ru:
            clear_region_errors();
            ru.setBackgroundResource(R.drawable.enter);
            set_region("ru");
            break;
        case R.id.euw:
            clear_region_errors();
            euw.setBackgroundResource(R.drawable.enter);
            set_region("euw1");
            break;
        case R.id.eun:
            clear_region_errors();
            eun.setBackgroundResource(R.drawable.enter);
            set_region("eun1");
            break;
        case R.id.na:
            clear_region_errors();
            na.setBackgroundResource(R.drawable.enter);
            set_region("na1");
            break;
        case R.id.summoner_name:
            clear_summoner_errors();
            summoner_name_input.setTextColor(Color.WHITE);
            break;
        case R.id.search:
            String region = this.region;
            String summoner_name_value = summoner_name_input.getText().toString();
            if (!summoner_name_value.isEmpty() && !region.isEmpty()) {
                GETAPI.check_summoner(region, summoner_name_value);

            }
            if (summoner_name_value.isEmpty()) {
                error_summoner(405);
            }
            if (region.isEmpty()) {
                error_summoner_region();
            }
            break;
    }
}




//
//МЕТОДЫ ОШИБОК
//

//ВЫВОДЫ ОШИБОК

public void error_summoner(Integer code) {
    if (code == 405) {
        error_text.setText("Введите имя призываетля");
    }
    if (code == 404) {
        error_text.setText("Данного призывателя не существует");
    }
}

public void error_summoner_region() {
    ru.setBackgroundColor(Color.RED);
    euw.setBackgroundColor(Color.RED);
    eun.setBackgroundColor(Color.RED);
    na.setBackgroundColor(Color.RED);
}


//ОЧИСТКА ОШИБОК

public void clear_summoner_errors() {
    error_text.setText("");
}

public void clear_region_errors() {
    ru.setBackgroundColor(0);
    euw.setBackgroundColor(0);
    eun.setBackgroundColor(0);
    na.setBackgroundColor(0);
}



public void set_region(String Region) {
    this.region = Region;
}


public void set_summoner_intent(String name, String value, Intent intent) {
    intent.putExtra(name, value);
}

public void set_id(String id) {
    this.summoner_id = id;
}



public void start_page(){
    startActivity(summoner_pagee);
}

public void start_summoner_page(Intent intent){
    System.out.print(summoner_pagee);
}

@Override
public void onSuccess(final String response) throws JSONException {
}

@Override
public void onFailure() {
    System.out.print("error");
}

}
  • Вам стоит добавить код, ибо не очень-то понятно) – selya Dec 25 '17 at 00:23
  • Добавил код, start_summoner_page лежит в другом классе) – Ornik500000 Dec 25 '17 at 00:29
  • как инициализируете клиента? Что передаете в Request request? – Виктор Dec 25 '17 at 10:36
  • public OkHttpClient client = new OkHttpClient(); - инициализация клинета. final Request request = new Request.Builder().url(this.GETURL.get_url_summoner_by_summoner_name(summoner_name, REGION)).build(); - формирование request. – Ornik500000 Dec 25 '17 at 10:38
  • @Ornik500000, что такое CHOICE? – ЮрийСПб Dec 25 '17 at 13:02
  • обращение к другому классу – Ornik500000 Dec 25 '17 at 13:02
  • start_summoner_page лежит в другом классе и к нему идет запрос на переход на новую страницу – Ornik500000 Dec 25 '17 at 13:03
  • @Ornik500000, если этот другой класс некая активити, и притом, не та актиивти, что сейчас активна - то так нельзя. Покажите/расскажите что у вас за CHOICE скрывается по подробнее. Ошибка там где-то, а не в приведённом коде. – ЮрийСПб Dec 25 '17 at 13:07
  • choice - это класс страницы, на которой сейчас находится пользователь. При клике на кнопку искать в классе HttpGet вызываются методы , которые делают API запрос и возвращают данные , после получения данных вызываю метод (перехода на другую страницу) из choice – Ornik500000 Dec 25 '17 at 13:10
  • @ЮрийСПб♦, при том, если этот же метод start_summoner_page вызвать без запроса в HttpGet, то проблем никаких нету – Ornik500000 Dec 25 '17 at 13:11
  • @ЮрийСПб♦, пробовал еще делать этот метод без параметром. То есть когда пользователь попадает на страницу choice , то сразу формируется Intent. Но почему-то в итоге, когда вызывал из call_summoner_name метод start_summoner_page , то intent был null – Ornik500000 Dec 25 '17 at 13:15
  • @Ornik500000б мне всё ещё не понятно что у вас происходит. Кажется, что у вас какие-то статические поля задействованы. Так нехорошо. Скорее всего в этом проблема. С другой стороны, пока вы не раскроете подробно детали я могу в течении часа набирать список возможных причин и всё одно все не перечислю. – ЮрийСПб Dec 25 '17 at 13:19
  • @ЮрийСПб♦, попробую описать подробнее) – Ornik500000 Dec 25 '17 at 13:20
  • @ЮрийСПб♦, пользователь находится на странице choice, где ему нужно ввести имя игрока и выбрать регион, когда он это все сделает, то нажимает кнопку "Искать". Есть класс HttpGet, который делает запросы API. После нажатии кнопки искать, вызывается метод из HttpGet, который отсылает запрос, чтобы получить id игрока и если такой игрок существует, то получает id и запускается метод сбора данных об игроке. После того как получено имя игрока, с помощью call_summoner_name, вызывается метод из класса choice(напомню , что это класс страницы ,где сейчас пользователь) и делаю попытку перейти. – Ornik500000 Dec 25 '17 at 13:24
  • @ЮрийСПб♦, вроде как здесь это не очень приветствуется , но прикреплю или скину ссылку на скриншоты кода , чтобы была яснее картина. – Ornik500000 Dec 25 '17 at 13:25
  • @ЮрийСПб♦, вот ссылка на скрины https://yadi.sk/d/D-kUgGUR3QwBFU – Ornik500000 Dec 25 '17 at 13:29

1 Answers1

0

Вы пытаетесь запустить активити В вызвав метод активити А. При этом активити А у вас создана через конструктор оной. Так нельзя делать с активити - они должны создаваться системой, не вами. В итоге у вас падение, т.к. активити не зарегистрирована в системе.

Вам надо передать в ваш класс ссылку на действующую активити, а не создавать новую.


Ваш код совершенно нечитаемый. Капсом именуют только константы. Классы именуют CamelCase-ом. Код скринами на стороннем ресурсе - плохо. Текстом в вопросе - хорошо.

  • Не понимаю почему , когда пытаюсь в методе вызвать Intent , который был определен в choice, он возвращает null – Ornik500000 Dec 25 '17 at 15:00
  • Вы его инициализирует в onCreate. А он не вызывается, ТК. Вы создали активити сами, а этот метод вызывается только системой. Вот он и пуст – ЮрийСПб Dec 25 '17 at 15:08
  • Просто странно, что не выходя из этого этого класса , Intent не пустой, но как только задействуется HttpGet, то сразу он в своем же классе в методах виден с значением null. При нажатии на кнопку "Искать ", вызываю этот Intent и он не null – Ornik500000 Dec 25 '17 at 15:14
  • @Ornik500000, у вас 2 разных экземпляра класса. Один создан системой, зарегистрирован в ней, активирован и в нём вызваны методы жизненного цикла, в коих вы инициализируете переменные. Второй создан вами. В нём ничего не вызвано и всё null. Просто не создавайте так экземпляров классов Активити и Фрагмент, а используйте ссылки на системные (созданные системой) экземпляры этих классов. – ЮрийСПб Dec 25 '17 at 15:35
  • ЮрийСПб♦, а можете , пожалуйста, подсказать, как корректнее будет определять ссылки. – Ornik500000 Dec 25 '17 at 16:45
  • Выложите код в вопрос текстом. С телефона скрины неудобно смотреть. А так вам надо в ваш ЧТОТОТАМGET активити через конструктор передать – ЮрийСПб Dec 25 '17 at 16:57
  • ЮрийСПб♦, добавил все 2 класса – Ornik500000 Dec 25 '17 at 17:04
  • Вы как раз активити и передаёте. Замените в конструкторе HttpListener на choice_player и переменную CHOICE этим аргументом и инициализирует. Все должно заработать. И ради бога следуйте конвенциям именования классов и переменных и методов. Сейчас кровь из глаз от взгляда на код. – ЮрийСПб Dec 25 '17 at 17:09
  • ЮрийСПб♦, очень сильно вам благодарен за время потраченное на мою проблему. У меня остается лишь один вопрос, какие книги посоветуете прочитать для поднятия уровня навыка программирования java? – Ornik500000 Dec 25 '17 at 17:41
  • @Ornik500000, если ответ вам помог, вы можете отметить его "верным", нажав на галочку слева от тела ответа. А книги вот тут смотрите: https://ru.stackoverflow.com/q/416634/17609. Вам подойдёт любая. – ЮрийСПб Dec 25 '17 at 21:04