Метод OnSuccess отвечает после завершения действия, чтобы заполнить элемент управления счетчика
Привет разработчикам программного обеспечения.
Я занимаюсь разработкой приложения для Android, которое использует службу REST, поэтому я использую Http Client Library ( http://loopj.com/android-async-http/), но я хочу заполнить элемент управления Spinner, поэтому я сначала вызываю к методу fillSpinnerTiposSiniestros и заполните ArrayList для последующего использования этого ArrayList для заполнения адаптера счетчика, но я не знаю, почему адаптер сначала устанавливается, а затем вызывается клиентом REST, поэтому счетчик остается пустым.
@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);
}
});
}
Я попытался с этим решением asynchttpclient дает ответ после активности, но у меня есть исключение, как:
Неустранимое исключение: 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:24).os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) в java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) в java.util.concurrent.ThreadPoolExcecutor: $ $ 588) at java.lang.Thread.run(Thread.java:818). Причина: java.lang.IllegalArgumentException: синхронный ResponseHandler, используемый в AsyncHttpClient. Вы должны создать свой обработчик ответа в зацикленном потоке или использовать вместо него SyncHttpClient. в com.loopj.android.http.AsyncHttpClient.sendRequest(AsyncHttpClient.java:1493) в com.loopj.android.http.AsyncHttpClient.get(AsyncHttpClient.java:1095) в com.maestroClientCest (SiniestroRESTClient.java:24) в com.maestria.lostperson.AddEditSinisterActivity$2.doInBackground(AddEditSinisterActivity.java:159) в android.os.AsyncTask$2.call(AsyncTask.java:295) в javascript. Выполнить (FutureTask.java:237) в android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) в java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) в java.til.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) в java.lang.Thread.run (Thread.java:818)
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);
}
});
вокруг вашего ответа. Или обработайте его с помощью создания обработчика, прежде чем вызывать асинхронный метод и использовать обработчик по возвращении. Все, что вы предпочитаете, хорошо. Это не достаточно тяжело, чтобы иметь сильные предпочтения, так или иначе.