Spinner android и okhttp3, когда я получил данные, они не отображаются в счетчике, только когда я нажимаю счетчик - PullRequest
0 голосов
/ 18 июня 2020

Я использую okhttp3 для получения данных, и затем эти данные отображаются в счетчике. Но этого не случилось. Счетчик пуст, но когда я опускаю счетчик, я вижу, что моя дата была получена с помощью okhttp3. Я не совсем уверен, почему счетчик пуст в начале.


    private List<String> categories;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_display_message);

        Intent intent = getIntent();
        String message = intent.getStringExtra("MESSAGE_LOGIN");

        TextView textView = findViewById(R.id.textView);
        textView.setText(message);

        categories = new ArrayList<String>();

        Log.d("LOGIN", "TEST!!!");
        final Spinner spinner = findViewById(R.id.spinner);

        RequestParams params = new RequestParams();
        params.add("type","category");

        RequestBody body = RequestBody.create(MediaType.parse("application/x-www-form-urlencoded; charset=utf-8"), params.toString());
        categories = postRequest(MainActivity.postURIStage, body);

        // Creating adapter for spinner
        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, categories);

        // Drop down layout style - list view
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        // Attaching data adapter to spinner
        spinner.setAdapter(dataAdapter);
        // Spinner click listener
        spinner.setOnItemSelectedListener(this);
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        // On selecting a spinner item
        String item = parent.getItemAtPosition(position).toString();
        // Showing selected spinner item
        Toast.makeText(parent.getContext(), "Selected: " + item, Toast.LENGTH_LONG).show();
    }
    public void onNothingSelected(AdapterView<?> arg0) {
        // TODO Auto-generated method stub
    }

    public List<String> postRequest(String postUrl, RequestBody postBody) {
        final List<String> categories1 = new ArrayList<String>();
        OkHttpClient client = new OkHttpClient();

        Request request = new Request.Builder()
                .url(postUrl)
                .post(postBody)
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                // Cancel the post on failure.
                call.cancel();
                Log.d("FAIL", e.getMessage());
                // In order to access the TextView inside the UI thread, the code is executed inside runOnUiThread()
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        TextView responseTextLogin = findViewById(R.id.responseTextLogin);
                        responseTextLogin.setText("Server is unreachable. Please try soon.");
                    }
                });
            }

            @Override
            public void onResponse(Call call, final Response response) throws IOException {
                // In order to access the TextView inside the UI thread, the code is executed inside runOnUiThread()
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        TextView responseTextLogin = findViewById(R.id.textView);
                        try {
                            String categoryResponseString = response.body().string();
                            Log.d("TEST:", categoryResponseString);

                            JSONObject jsonResponse = new JSONObject(categoryResponseString);
                            Log.d("Message", "Message form the server : " + jsonResponse.getJSONArray("message"));
                                try {
                                    // Parse categories from api.php
                                    JSONArray categoriesArray = jsonResponse.getJSONArray("message");
                                    // Lopping through all categories
                                    for (int i = 0; i < categoriesArray.length(); i++) {
                                        JSONObject c = categoriesArray.getJSONObject(i);
                                        String name = c.getString("name");
                                        categories1.add(name);
                                    }
                                } catch (final JSONException e) {
                                    Log.e("TAG", "Json parsing error: " + e.getMessage());
                                }

                        } catch (Exception e) {
                            e.printStackTrace();
                            responseTextLogin.setText("No categories as active state in DB!");
                        }
                    }
                });
            }
        });

        return categories1;

    }
}

Хотя я выберу данные в счетчике, никакой реакции на эту функцию setOnItemSelectedListener прикрепленные фотографии, на которых можно увидеть пустой счетчик, и когда я нажимаю его, отображаются данные, но они не отображаются в начале.

Пустой счетчик

Когда я нажали

1 Ответ

0 голосов
/ 18 июня 2020

В зависимости от того, как написан ваш код, счетчик заполняется пустыми категориями ArrayList перед возвратом результатов.

Вы можете переместить популяцию счетчика в onResponse метода postRequest

public List<String> postRequest(String postUrl, RequestBody postBody) {
        final List<String> categories1 = new ArrayList<String>();
        OkHttpClient client = new OkHttpClient();

        Request request = new Request.Builder()
                .url(postUrl)
                .post(postBody)
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                // Cancel the post on failure.
                call.cancel();
                Log.d("FAIL", e.getMessage());
                // In order to access the TextView inside the UI thread, the code is executed inside runOnUiThread()
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        TextView responseTextLogin = findViewById(R.id.responseTextLogin);
                        responseTextLogin.setText("Server is unreachable. Please try soon.");
                    }
                });
            }

            @Override
            public void onResponse(Call call, final Response response) throws IOException {
                // In order to access the TextView inside the UI thread, the code is executed inside runOnUiThread()
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        TextView responseTextLogin = findViewById(R.id.textView);
                        try {
                            String categoryResponseString = response.body().string();
                            Log.d("TEST:", categoryResponseString);

                            JSONObject jsonResponse = new JSONObject(categoryResponseString);
                            Log.d("Message", "Message form the server : " + jsonResponse.getJSONArray("message"));
                            try {
                                // Parse categories from api.php
                                JSONArray categoriesArray = jsonResponse.getJSONArray("message");
                                // Lopping through all categories
                                for (int i = 0; i < categoriesArray.length(); i++) {
                                    JSONObject c = categoriesArray.getJSONObject(i);
                                    String name = c.getString("name");
                                    categories1.add(name);
                                }

                                // Creating adapter for spinner
                                ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, categories);

                                dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                                // Attaching data adapter to spinner
                                spinner.setAdapter(dataAdapter);
                                // Spinner click listener
                                spinner.setOnItemSelectedListener(this);
                            } catch (final JSONException e) {
                                Log.e("TAG", "Json parsing error: " + e.getMessage());
                            }

                        } catch (Exception e) {
                            e.printStackTrace();
                            responseTextLogin.setText("No categories as active state in DB!");
                        }
                    }
                });
            }
        });

        return categories1;

    }

Или вы можете поместить свой код в поток и получить результаты в потоке пользовательского интерфейса перед заполнением счетчика

new Thread(new Runnable() {
            @Override
            public void run() {
                categories = postRequest(MainActivity.postURIStage, body);

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        // Creating adapter for spinner
                        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, categories);

                        // Drop down layout style - list view
                        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                        // Attaching data adapter to spinner
                        spinner.setAdapter(dataAdapter);
                        // Spinner click listener
                        spinner.setOnItemSelectedListener(this);
                    }
                });

            }
        }).start();
...