2017-12-12 9 views
0

ハローソフトウェア開発者。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); 
       } 
      }); 
} 

Iこの溶液asynchttpclient gives response after activityと試みたが、私のような例外があります

致命的な例外:AsyncTask#1 プロセス:com.maestria.lostperson、PID:13433 java.langです。 RuntimeException:doInBackground()を実行中にエラーが発生しました。アンドロイド.os.AsyncTask $ 3.done()の で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(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) で。 javaのでandroid.os.AsyncTask $ 2.call(AsyncTask.java:295) でSiniestroRESTClient.get(SiniestroRESTClient.java:24)com.maestria.lostperson.AddEditSinisterActivity $ 2.doInBackground(AddEditSinisterActivity.java:159) で 。 (UnrealTask​​.java:234) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecuto())このスレッドに返信します...返信>あなたがいるjava.lang.Thread.runでjava.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:588) (Thread.java:818)

答えて

0

でr.java:1113) バックグラウンドスレッドから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を処理し、返されたときにHandlerを使用します。どちらが好きでも大丈夫です。それは、どちらか一方の強い好みを持つのに十分なほど重くはありません。

+0

私に例を教えてもらえますか? –

+0

私は笑いました。上記のコードを提供しました。ブロック内にコードを移動するだけです。ここで私は更新します。 – Sam

+0

次に、この全体をonSuccessの内側に置く – Sam

関連する問題