2017-12-12 4 views
0

Hello 소프트웨어 개발자.OnSuccess 메서드는 활동이 완료되어 회 전자 컨트롤을 채운 후에 응답합니다.

Http 클라이언트 라이브러리 (http://loopj.com/android-async-http/)를 사용하고 있으므로 REST 서비스를 사용하는 안드로이드 응용 프로그램을 개발 중이지만 처음에는 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 gives response after activity와 시도,하지만 같은 예외가 있습니다

치명적인 예외 : AsyncTask를 # 1 과정 : com.maestria.lostperson, PID : 13433 java.lang의를. RuntimeException : android.os.AsyncTask $ 3.done에서 doInBackground()를 실행하는 동안 오류가 발생했습니다. at java.util.concurrent.FutureTask.finishCompletion (FutureTask.java:354) java.util.concurrent.FutureTask.setException (FutureTask.java:223) at java.util.concurrent.FutureTask.run (FutureTask.java:242) android.os.AsyncTask $ SerialExecutor $ 1.run (AsyncTask. java : 234) at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:588) at java.lang.Thread. run (Thread.java:818) 발생 원인 : java.lang.IllegalArgumentException : AsyncHttpClient에서 사용되는 동기 ResponseHandler. 루퍼 스레드에서 응답 핸들러를 작성하거나 대신 SyncHttpClient를 사용해야합니다. com.maestria.lostperson.clients에서 com.loopj.android.http.AsyncHttpClient.get (AsyncHttpClient.java:1095) 에서 com.loopj.android.http.AsyncHttpClient.sendRequest (AsyncHttpClient.java:1493) 에서 . 자바에서 android.os.AsyncTask $ 2.call (AsyncTask.java:295) 에서 SiniestroRESTClient.get (SiniestroRESTClient.java:24) com.maestria.lostperson.AddEditSinisterActivity $ 2.doInBackground (AddEditSinisterActivity.java:159) 에서 . util.concurrent.FutureTask.run (FutureTask.java:237) android.os.AsyncTask에서 $ SerialExecutor $ 1.run (AsyncTask.java:234) at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecuto r.java:1113) java.lang.Thread.run에서 java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:588) 에서 (Thread.java:818)

답변

0

당신은 배경 스레드에서 UI 구성 요소를 만지려고합니다. 다음을 추가하십시오.

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); 
     } 
    }); 

답장을 보내주십시오. 또는 비동기 메서드를 호출하고 반환 할 때 Handler를 사용하기 전에 Handler를 생성하여 처리하십시오. 당신이 선호하는 것이 좋습니다. 그것은 강한 선호도를 가지기에 충분하지 않습니다.

+0

예를 보여 줄 수 있습니까? –

+0

나는 방금 축하했다. 위의 코드를 제공 했으므로 코드를 블록 내부로 옮기십시오. 여기서 나는 갱신 할 것이다. – Sam

+0

그 다음이 전체 광고 문안을 onSuccess 내부에 넣습니다. – Sam