2016-08-24 4 views
0

のためのスレッドを聞いUiThreadにデータのスレッドを送信する私はこのスレッドどのようにハンドラを使用し、Java(アンドロイドスタジオ)</p> <p>を使用して応答

void obtenerDatosBackground() { 


    Thread EnviarCoordenadasHilo = new Thread(new Runnable() { 
     public void run() { 

      obtenerDatos(); 
     } 
    }); 



    statusSync.CheckConnection(EnviarCoordenadasHilo); 



} 

を持っていると私は私のコードでこれを持っている:

void configHandler() 
{ 
    //con esto le digo al handler que esta adjuntado a la UI 
    handler = new Handler(Looper.getMainLooper()){ 
     @Override 
     public void handleMessage(Message msg) { 
      super.handleMessage(msg); 
     } 
    }; 

} 

しかし、このハンドラをスレッドに設定する方法はわかりません。

は最後に、私は、get結果のリスナーを使用してUIを更新するが、私はこのメッセージを得た:ビュー階層は、その ビューに触れることができます作成​​し

のみ元のスレッドを。

私は読んだことがある(少し)に関するhandlerが、私は結果

私はこれが、それにコードを変更する必要がありを得たとき、私は、更新UI用(非UI)スレッドへのハンドラを設定することができる方法まだ私はスレッド対応のリスナーを使用しています REMEMBER

void obtenerDatosBackground() 
{ 
    Thread EnviarCoordenadasHilo = new Thread(new Runnable() { 
     public void run() { 
      obtenerDatos(); 
      Handler handler = new Handler(Looper.getMainLooper()); 
      handler.post(new Runnable() { 

       @Override 
       public void run() { //do what you want to do here 
        int uno=1; 
       } 
      }); 
     } 
    }); 

    statusSync.CheckConnection(EnviarCoordenadasHilo); 
} 

いけない仕事

void setmListado() 
{ 

    adapter = new VehiculoAdapter(getActivity(), mListado); 
    lvListado.setAdapter(adapter); 
    lvListado.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
      vehicleObject = (Vehiculo) adapter.getItem(i); 
      edtEconomicNumber=vehicleObject.getNumeroEconomico(); 
      if(mListener!=null) 
       mListener.onDismissResult(vehicleObject,edtEconomicNumber); 
      else 
       Log.w(getTag(),"Falta implementar OnFragmentInteractionListener"); 
      dismiss(); 
     } 
    }); 

    txtBuscar.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      // TODO Auto-generated method stub 
      //f_car_listado.this.adapter.getFilter().filter(arg0); 
      //boolean uno=false; 

      if (count < before) { 
       // We're deleting char so we need to reset the adapter data 
       adapter.resetData(); 
      } 
      adapter.getFilter().filter(s.toString()); 


     } 

     @Override 
     public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, 
             int arg3) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void afterTextChanged(Editable arg0) { 
      // TODO Auto-generated method stub 

     } 
    }); 

} 

ここで私はあなたが新しいスレッドを作成するAsyncTaskクラスを使用して、タスクが完了したときに通知されますあなたのハンドラのインスタンスを送信することができますスレッド

@Override 
public void onFragmentFinished(boolean terminoBien, List<VehiculoResponseDTO> listado) { 

    dialogFragment.dismiss(); 

    if(terminoBien) 
    { 

     if(listado.size()>0) { 
      mListado = ListadoDTOaVehiculos(listado); 
      //adapter = new VehiculoAdapter(getActivity(), mListado); 
      //lvListado.setAdapter(adapter); 
      setmListado(); 
      //adapter.notifyDataSetChanged(); 
     } 
     else { 
      this.dismiss(); 
      f_seguimiento.DialogMensaje(getString(R.string.nohayvehiculos), getString(R.string.nohayvehiculosMensaje), true, null, getActivity()); 

     } 
    }else 
    { 
      this.dismiss(); 
     f_seguimiento.DialogMensaje(getString(R.string.ocurrioProblema),getString(R.string.errorVehiculos),true,null,getActivity()); 
    } 
} 

答えて

0

からrespondeを持って、私はあなたが読んでお勧めします約AsyncTask前。 コンストラクタを使用してハンドラオブジェクトを渡し、android.os.Messageオブジェクトを使用してメッセージをハンドラに送信することができます。

と、これは単に手順のコードです:

これは

私はconfigHandlerに呼び出す
void configHandler() 
{ 
    //con esto le digo al handler que esta adjuntado a la UI 
    handler = new Handler(Looper.getMainLooper()){ 
     @Override 
     public void handleMessage(Message msg) { 
      super.handleMessage(msg); 

      setmListado(); 
     } 
    }; 

} 

私のハンドラである 簡単に言うと、私は最終的にこのVideoで解決here

0
Handler handler = new Handler(Looper.getMainLooper());                
handler.post(new Runnable() { 
@Override 
public void run() { 
//do what you want to do here 
} 
}); 
+0

とされ、このコード内に属している設定Looper.getMainLooper()を使用して、このラインにconfigHandler() にスレッド

それは(非UI)でのUIスレッドとなしにある呼び出しされている場合ので、スレッド? – angel

+0

あなたのビューを更新したい場所から上記のコードを呼び出してください。 – Ashish

+0

無効obtenerDatosBackground(){ スレッドEnviarCoordenadasHilo =新しいスレッド(新しいRunnableを(){ ます。public void実行(){ obtenerDatos();ハンドラハンドラ=新しいハンドラ(Looper.getMainLooper()); handler.post (新しいRunnableを(){@Override ます。public void実行(){// あなたが}ここ を をやりたい});} を }); statusSync.CheckConnection(EnviarCoordenadasHilo); } – Ashish

0

を文書化作成中

と私のリスナーに

@Override 
public void onFragmentFinished(boolean terminoBien, List<VehiculoResponseDTO> listado) { 

    dialogFragment.dismiss(); 

    if(terminoBien) 
    { 

     if(listado.size()>0) { 
      mListado = ListadoDTOaVehiculos(listado); 
      //adapter = new VehiculoAdapter(getActivity(), mListado); 
      //lvListado.setAdapter(adapter); 
      Message message =Message.obtain(); 
      handler.sendMessage(message); 
      //adapter.notifyDataSetChanged(); 
     } 
     else { 
      this.dismiss(); 
      f_seguimiento.DialogMensaje(getString(R.string.nohayvehiculos), getString(R.string.nohayvehiculosMensaje), true, null, getActivity()); 

     } 
    }else 
    { 
      this.dismiss(); 
     f_seguimiento.DialogMensaje(getString(R.string.ocurrioProblema),getString(R.string.errorVehiculos),true,null,getActivity()); 
    } 
} 

これらの行(それは(非UI)スレッド上で実行している忘れないでください):

Message message =Message.obtain(); 
     handler.sendMessage(message); 

コール明示的configHandler() 内のコードこれらの行:

@Override 
      public void handleMessage(Message msg) { 
       super.handleMessage(msg); 

       setmListado(); 
      } 

しかしそれは何の仕事ですか?handleMessageが、私はこのハンドラはUIスレッド

handler = new Handler(Looper.getMainLooper()) 
関連する問題