Метод OnSuccess отвечает после завершения действия, чтобы заполнить элемент управления счетчиком.

Здравствуйте, разработчики программного обеспечения.

Я разрабатываю приложение для Android, которое использует службу REST, поэтому я использую клиентскую библиотеку Http (http://loopj.com/android-async-http/), но я хочу заполнить элемент управления счетчиком, поэтому я сначала вызываю метод fillSpinnerTiposSiniestros и заполняю ArrayList, чтобы позже использовать этот ArrayList для заполнения адаптера spinner, но я не знаю, почему адаптер сначала устанавливается, а потом вызывается REST-клиентом, так что spinner остается пустым.

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

    editTextValorClave = (EditText) findViewById(R.id.editTextSinisterValorClave);
    editTextValorCurp = (EditText) findViewById(R.id.editTextSinisterValorCurp);
    editTextValorDependencia = (EditText) findViewById(R.id.editTextSinisterValorDependencia);
    editTextValorRFC = (EditText) findViewById(R.id.editTextSinisterValorRFC);
    editTextValorStatus = (EditText) findViewById(R.id.editTextSinisterValorStatus);
    //editTextValorTipoSiniestro = (EditText) findViewById(R.id.editTextSinisterValorTipoSiniestro);
    spinnerTipoSiniestro = (Spinner) findViewById(R.id.spinnerTipoSiniestro);

    editTextValorNumAmbulancia = (EditText) findViewById(R.id.editTextSinisterNumAmbulancia);
    editTextValorNombreSieniestro = (EditText) findViewById(R.id.editTextSinisterNombreSieniestro);
    editTextValorLocalizacion = (EditText) findViewById(R.id.editTextSinisterValorLocalizacion);
    textViewMuestraEncabezado = (TextView) findViewById(R.id.textViewTitulo);

    botonAccionAddEdit = (Button) findViewById(R.id.buttonSinisterAddEdit);
    botonAccionAddEdit.setOnClickListener(eventoAccionBotonAddEdit);

    Bundle miBlunde = getIntent().getExtras();

    opcion = miBlunde.getInt("Opcion");
    claveGlobal = miBlunde.getInt("Clave");

    CargarDatosSpinner;
}

private void rellenarSpinnerTiposSiniestros(){
    List<Header> encabezados = new ArrayList<Header>();
    encabezados.add(new BasicHeader("Accept", "application/json"));


    SiniestroRESTClient.get(AddEditSinisterActivity.this, "api/TipoSiniestro", encabezados.toArray(new Header[encabezados.size()]), null,
            new JsonHttpResponseHandler()
            {
                @Override
                public void onSuccess(int statusCode, Header[] headers, JSONArray response)
                {
                    arrayTipoSiniestro = new ArrayList<TipoSiniestro>();
                    tipoSiniestroAdapter = new SpinnerTipoSiniestroAdapter(getApplicationContext(), android.R.layout.simple_spinner_dropdown_item, (TipoSiniestro[]) arrayTipoSiniestro.toArray());

                    for(int i = 0; i < response.length(); i++)
                    {
                        try
                        {
                            tipoSiniestroAdapter.add(new TipoSiniestro(response.getJSONObject(i)));
                        }
                        catch(JSONException e)
                        {
                            e.printStackTrace();
                        }
                    }
                    tipoSiniestroAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                    spinnerTipoSiniestro.setAdapter(tipoSiniestroAdapter);
                }
            });
}

Я пробовал с этим решением https://stackoverflow.com/questions/29301157/asynchttpclient-onsuccess-method-gives-response-after-activity-is-finished , но у меня есть исключение вроде:

Вы пытаетесь коснуться компонентов пользовательского интерфейса из фонового потока. Просто добавьте:


person Hugo Rojas    schedule 12.12.2017    source источник


Ответы (1)


вокруг вашего ответа. Или обработайте это созданием обработчика перед вызовом асинхронного метода и использованием обработчика при возврате. Что бы вы ни предпочли, это нормально. Это не достаточно тяжело, чтобы иметь сильное предпочтение тому или иному.

  runOnUiThread(new Runnable() {
        @Override
        public void run() {
             arrayTipoSiniestro = new ArrayList<TipoSiniestro>();
                tipoSiniestroAdapter = new SpinnerTipoSiniestroAdapter(getApplicationContext(), android.R.layout.simple_spinner_dropdown_item, (TipoSiniestro[]) arrayTipoSiniestro.toArray());

                for(int i = 0; i < response.length(); i++)
                {
                    try
                    {
                        tipoSiniestroAdapter.add(new TipoSiniestro(response.getJSONObject(i)));
                    }
                    catch(JSONException e)
                    {
                        e.printStackTrace();
                    }
                }
                tipoSiniestroAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                spinnerTipoSiniestro.setAdapter(tipoSiniestroAdapter);
        }
    });

Я только что сделал, лол. Я предоставил вам код выше, просто переместите ваш код внутрь блока. Здесь я буду обновлять.

person Sam    schedule 12.12.2017
comment
Затем поместите всю эту аннотацию внутрь onSuccess. - person Sam; 12.12.2017
comment
НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: процесс AsyncTask #1: com.maestria.lostperson, PID: 13433 java.lang.RuntimeException: произошла ошибка при выполнении doInBackground() в android.os.AsyncTask$3.done(AsyncTask.java:309) в java. util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) в java.util.concurrent.FutureTask.setException(FutureTask.java:223) в java.util.concurrent.FutureTask.run(FutureTask.java:242) в android .os.AsyncTask$SerialExecutor$1.run(Asy ncTask.java:234) в java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) в java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) в java.lang.Thread.run (Thread.java:818) Причина: java.lang.IllegalArgumentException: Synchronous ResponseHandler используется в AsyncHttpClient. Вы должны создать свой обработчик ответа в потоке петлителя или вместо этого использовать SyncHttpClient. на com.loopj.android.http.AsyncHttpClient.sendRequest(AsyncHttpClient.java:1493) на com.loopj.android.http.AsyncHttpClient.get(AsyncHttpClient.java:1095) на com.maestria.lostperson.clients.SiniestroRESTClient.get (SiniestroRESTClient.java:24) на com.maestria.lostperson.AddEditSinisterActivity$2.doInBackground(AddEditSinisterActivity.java:159) на android.os. AsyncTask$2.call(AsyncTask.java:295) в java.util.concurrent.FutureTask.run(FutureTask.java:237) в android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)  в java.util .concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) на java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) на java.lang.Thread.run(Thread.java:818) - person Sam; 12.12.2017