Почему Android Toast не отображается? - PullRequest
0 голосов
/ 15 марта 2019

У меня проблема с получением Toast

public class LiveMatch extends Fragment {

    private List<Items_list> matches;

    private static final String URL="https://www.cricbuzz.com/match-api/livematches.json";

    private String recent_match;


    View v;

    public LiveMatch() {
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        v = inflater.inflate(R.layout.live, container, false);

        return v;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        matches = new ArrayList<>();
        final StringRequest stringRequest = new StringRequest(Request.Method.GET, URL, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                try {
                    JSONArray live_match = new JSONArray(response);
                    Toast.makeText(v.getContext(),live_match.length(),Toast.LENGTH_LONG).show();
                    for (int i = 0; i < live_match.length(); i++) {
                        JSONObject object = live_match.getJSONObject(i);

                        recent_match = object.getString("mathes");

                        RecyclerView recyclerView = v.findViewById(R.id.recycl);
                        RecylerAddapter recylerAddapter = new RecylerAddapter(getContext(), matches);
                        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
                        recyclerView.setAdapter(recylerAddapter);
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

        },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(v.getContext(), error.toString(), Toast.LENGTH_SHORT).show();
                    }
                });

        Volley.newRequestQueue(Objects.requireNonNull(getContext())).add(stringRequest);
}
}

Ответы [ 5 ]

1 голос
/ 15 марта 2019

Тосты могут быть показаны только на петельных нитях, таких как основная нить. Я предполагаю, что обратные вызовы от Volley запускаются в рабочем потоке.

Покажите свой тост из основной ветки:

getActivity().runOnUiThread({
    Toast.makeText(...).show()
})

Я использую лямбда-нотацию Java 8, но вы можете адаптировать ее к Runnable.

Как говорится, прочитайте все остальные ответы.

0 голосов
/ 15 марта 2019

Проблема в анализе ответа JSON.

Ответ Web-сервиса (API) приходит в JSONObject, а вы обрабатываете его в JSONArray.
Смотрите ответ Livestream URL

enter image description here

Исправьте ваш код обработки ответа, и он будет работать.

Обратите внимание, что вы должны получить значения путем итерации цикла с использованием Iterator, поскольку объект совпадений содержит JSONObjects.

Обновите ваш метод onResponse, как показано ниже:

@Override
public void onResponse(String response) {
    try {
        JSONObject jsonObject = new JSONObject(response);
        Log.e("Response: ", jsonObject.toString());
        JSONObject objMatch = jsonObject.optJSONObject("matches");
        Iterator<String> iterator = objMatch.keys();
        int counter = 0;

        while (iterator.hasNext()) {
            String key = iterator.next();
            try {
                JSONObject value = objMatch.getJSONObject(key);
                Log.e("Value: ", value.toString());
                // Here you have to add values in Items_list  and then after add it in matches list
                counter++;
            } catch (JSONException e) {
                // Something went wrong!
            }
        }
        Toast.makeText(getActivity(), "Total Records: " + counter, Toast.LENGTH_LONG).show();
        // After competition of iterator loop, you have to set that List in RecyclerView Adapter here
    } catch (JSONException e) {
        e.printStackTrace();
    }
}
0 голосов
/ 15 марта 2019

Toast принимает только CharSequence "String". Преобразуйте ваше значение в строку, и вы сможете увидеть тост. String.Valueof (ваша ценность). live_match.length () может быть целым числом. Во фрагменте попробуйте getActivity ()

public static Toast makeText(Context context, CharSequence text, @Duration int duration) {
    return makeText(context, null, text, duration);
}
0 голосов
/ 15 марта 2019

Метод Toast makeText перегружен, его можно загрузить, передав идентификатор ресурса

makeText (Контекст контекста, int resId, int duration)

или передача текста для отображения

makeText (Контекст контекста, текст CharSequence, int duration)

Если вы загрузите его с целым числом live_match.length()Android пытается загрузить необходимый ресурс, но он не может быть найден, поэтому тост не отображается.Чтобы достичь своей цели, вы должны преобразовать это целое число в строку (на самом деле CharSequence), как сказано в комментариях.

Toast.makeText(getActivity(), String.valueOf(live_match.length()), Toast.LENGTH_LONG).show();

Если это не сработает, убедитесь, что вы можете коснуться основного потока оттуда, ядумаю, вы загружаете тост в фоновом потоке, где не разрешено касаться пользовательского интерфейса

0 голосов
/ 15 марта 2019

вы должны использовать getActivity() или getContext() во фрагментах, чтобы получить контекст по умолчанию и использовать его. очистите v.getContext() и вызовите один из вышеперечисленных методов

...