2016-08-24 8 views
0

Использование Java (Android Studio)Как отправить данные тему UiThread с помощью обработчика и прослушивания нити для ответа

У меня есть эта нить

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

} 

но я не знаю, как установить этот обработчик на поток.

Наконец я использую для слушателя результат получить и обновить пользовательский интерфейс, но я получил это сообщение:

Только оригинальный поток, созданный вид иерархии может коснуться ее взглядов.

Я прочитал (немного) о handler, но как я могу установить обработчик (не UI) нить для обновления пользовательского интерфейса, когда я получил результат

У меня есть изменить код, чтобы это, но это пока не работает

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 

     } 
    }); 

} 

здесь я получил Отвечаю от резьбы

@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

Вы можете использовать класс AsyncTask, чтобы создать новую тему и отправить экземпляр вашего обработчика, который будет уведомлен, когда задача выполнена, я хотел бы предложить вам прочитать около AsyncTask раньше. Вы можете использовать конструктор для передачи объекта обработчика, а затем использовать объект android.os.Message для отправки сообщения обработчику! Кратко документированы here

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

и в этом коде, где находится нить? – angel

+0

просто назовите приведенный выше код с того места, где вы хотите обновить свое представление. – Ashish

+0

недействительным obtenerDatosBackground() { Thread EnviarCoordenadasHilo = новая тема (новый Runnable() { общественного недействительными запуска() { obtenerDatos(); Обработчик обработчик = новый обработчик (Looper.getMainLooper()); handler.post (новый Runnable() { @Override общественности недействительным запуска() {// делать то, что вы хотите сделать здесь } });} }); statusSync.CheckConnection (EnviarCoordenadasHilo); } – Ashish

0

я, наконец, решил с этим Video:

и это код в просто шаги:

это мой обработчик

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

} 

Я называю configHandler на Oncreate

и на моем слушателю (Помните, что это работает на (Non щ) Thread)

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

эти строки:

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

вызова код внутри configHandler() в явном виде эти строки:

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

       setmListado(); 
      } 

но что это работает?потому что, когда handleMessage вызвать его на UI потоке и не в (Non UI) резьбы

в configHandler() в этой строке с помощью Looper.getMainLooper() я устанавливаю этот обработчик принадлежит поток пользовательского интерфейса

handler = new Handler(Looper.getMainLooper())