CERCA
PER MODELLO
FullScreen Chatbox! :)

Utente del giorno: gianpassa con ben 2 Thanks ricevuti nelle ultime 24 ore
Utente della settimana: 9mm con ben 10 Thanks ricevuti negli ultimi sette giorni
Utente del mese: 9mm con ben 34 Thanks ricevuti nell'ultimo mese

Visualizzazione dei risultati da 1 a 7 su 7
Discussione:

aggiornamento activity tramite services

Se questa discussione ti è stata utile, ti preghiamo di lasciare un messaggio di feedback in modo che possa essere preziosa in futuro anche per altri utenti come te!
  1. #1
    Baby Droid


    Registrato dal
    Nov 2012
    Messaggi
    23

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    aggiornamento activity tramite services

    salve a tutti...sto cercando un modo per far comunicare un activity con un services...in particolar modo nell'activity ho una listView con dei dati...il problema è che questa listView l'ho implementata con un BaseAdapter cioè che non è una normale lista di dati ma ogni riga ha un proprio layout con una serie di elementi...questo fa si che io nel service,quando aggiorno la lista dei dati, non posso lanciare il metodo adapter.notitySetChanged ecc ecc perkè il mio adapter non è un normale lista di dati ma è una lista di "RowLayout"...insomma come posso quindi aggiornare il thread della Ui dell'activity dal Services ???

    grazie mille..

  2.  
  3. #2
    Baby Droid


    Registrato dal
    Aug 2011
    Messaggi
    44

    Ringraziamenti
    0
    Ringraziato 6 volte in 6 Posts
    Predefinito

    Devi usare un broadcast lanciato dal servizio e ricevuto dall'activity tramite un broadcast receiver

    Inviato dal mio Galaxy Nexus con Tapatalk 2

  4. #3
    Baby Droid


    Registrato dal
    Nov 2012
    Messaggi
    23

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Quote Originariamente inviato da crbin1 Visualizza il messaggio
    Devi usare un broadcast lanciato dal servizio e ricevuto dall'activity tramite un broadcast receiver

    Inviato dal mio Galaxy Nexus con Tapatalk 2
    uhmm ok grazie mille,ma riusciresti ad essere un po piu chiaro magari con un esempio pratico??
    grazie mille..

  5. #4
    Baby Droid


    Registrato dal
    Aug 2011
    Messaggi
    44

    Ringraziamenti
    0
    Ringraziato 6 volte in 6 Posts
    Predefinito

    Nel service nel punto in cui vuoi aggiornare i dati crei un Intent e lo invii tramite sendBroadcast().

    codice:
    Intent intent = new Intent ("IntSvc");
    intent.putExtra("IntentType", Constants.IntentType.UPDATE_LISTVIEW);
    sendBroadcast(intent);
    Nell'acivity devi crearti un BroadcastReceiver che aggiorna i dati

    codice:
    @Override
    public void onResume() {
         IntentFilter filterDBF = new IntentFilter("IntSvc");
         registerReceiver(receiverDbf, new IntentFilter(filterDBF));
    }
    
    @Override
    public void onPause() {
         super.onPause();
         unregisterReceiver(receiverDbf);
    }
    
    private final BroadcastReceiver receiverDbf = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
              if (intent.getIntExtra("IntentType", 0)==Constants.IntentType.UPDATE_LISTVIEW) {
                   getContentResolver().notifyChange(MyProvider.CONTENT_URI_MY_TABLE, null);
              }
         }
    }

  6. #5
    Baby Droid


    Registrato dal
    Nov 2012
    Messaggi
    23

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    ok grazie mille..anke se in realtà mi da un errore su Costant.IntentType.UPDATE_LISTVIEW...probabilmente è stata deprecata questa espressione..cioè per Constants non ho nessun metodo o interfaccia che posso richiamare di dipo IntentType...ad ogni modo cosi facendo quindi mi viene aggiornata l'adapter contenente la lista dei dati??? perkè cmq io nel services faccio delle operazioni quali aggiornare alcune liste di dati...poi nell'activity dovrei fare in modo che con queste liste venisse aggiornato il mio adapter...

    una cosa di questo tipo :

    liveRow = new ArrayList<LiveRowItem>();
    for (int i = 0; i < matchLive.size(); i++) {
    LiveRowItem item = new LiveRowItem( parzialiLive.get(i),minutiDiGioco.get(i),risultati Live.get(i),R.drawable.lente,this);
    liveRow.add(item);
    }

    RowLiveLayout adapter = new RowLiveLayout(this, liveRow);
    listView.setAdapter(adapter);
    listView.setOnItemClickListener(this);

    doce "parzialiLive", "minutiDiGioco" e "risultatiLive" sono le tre liste che io aggiorno nel services..e poi nell'activity con queste 3 liste dovrei settare nuovamente il mio adapter che, come si evince dal codice e come avevo scritto nel primo post, non è una normale lista di dati per cui io posso applicare il metodo notify.setchanged ma è una lista di "RowLiveLayout"..ovvero che per ogni riga della listView ho un proprio layout....

    in ogni caso resta il problema che,come ho gia scritto sopra, l'espressione Constant.IntentType probabilmente è deprecata....
    sperando che mi sia ancora di aiuto ti ringrazio tanto :-)

  7. #6
    Baby Droid


    Registrato dal
    Aug 2011
    Messaggi
    44

    Ringraziamenti
    0
    Ringraziato 6 volte in 6 Posts
    Predefinito

    No no aspetta, lascia perdere Constants.IntentType.UPDATE_LISTVIEW, io ho una classe dove mi salvo delle costanti e nel copia incolla mi è rimasto, al posto di Constants.IntentType.UPDATE_LISTVIEW metti 1 per esempio o qualsiasi altro numero, basta che sia sempre lo stesso.

    Ma i dati li salvi in un databse e li modifichi nel Service? Ho capito bene? O li salvi da qualche altra parte?

  8. #7
    Baby Droid


    Registrato dal
    Nov 2012
    Messaggi
    23

    Ringraziamenti
    0
    Ringraziato 0 volte in 0 Posts
    Predefinito

    no in pratica i dati li prendo dal web e me li salvo in dei normali ArrayList di una classe astratta per una questione di visibilità..si tratta solo di 2-3 array di roba quindi secondo me non ha senso implementare un db...nel services non faccio altro che invocare nuovamente i metodi e le classi che mi estrapolano i dati dal web..in ogni caso sulla falsa riga del tuo suggerimento avevo implementato il tutto in questo mopo...segue codice...seconde è giusto il tutto?? è giusto che nell'OnCreate dell'activity faccio prima partire il services e poi subito dopo metto l'intent per ricevere il tutto dal services??? serve implementare anke il metodo onResume() nell'activity??

    *********************
    ACTIVITY
    *********************

    package com.myProg.ita.thesis;

    import java.util.ArrayList;

    public class ControllaLive extends Activity implements OnItemClickListener,MatchView {

    private Button refresh;
    private ImageView image;

    public static ListView listView;
    public static List<LiveRowItem> liveRow;


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_controlla_live);

    liveRow = new ArrayList<LiveRowItem>();
    for (int i = 0; i < matchLive.size(); i++) {
    LiveRowItem item = new LiveRowItem( parzialiLive.get(i),minutiDiGioco.get(i),risultati Live.get(i),R.drawable.lente,this);
    liveRow.add(item);
    }

    listView = (ListView) findViewById(android.R.id.list);
    RowLiveLayout adapter = new RowLiveLayout(this, liveRow);
    listView.setAdapter(adapter);
    listView.setOnItemClickListener(this);

    try{
    startServices();---------------------->FACCIO PARTIRE IL SERVICES IL QUALE ESTRAPOLA I DATI ED AGGIORNA L'ACTIVITY
    }
    catch (Exception e) {
    Log.i("ERRORE ", e.getMessage());
    }


    IntentFilter filter = new IntentFilter("com.example.updatelist");-------------------->RICEVO DAL SERVICES
    registerReceiver(receiverDbf, filter);


    }
    public void aggiorna(){
    liveRow = new ArrayList<LiveRowItem>();
    for (int i = 0; i < matchLive.size(); i++) {
    LiveRowItem item = new LiveRowItem( parzialiLive.get(i),minutiDiGioco.get(i),risultati Live.get(i),R.drawable.lente,this);
    liveRow.add(item);
    }

    RowLiveLayout adapter = new RowLiveLayout(this, liveRow);
    listView.setAdapter(adapter);
    listView.setOnItemClickListener(this);
    }

    private void startServices() {
    Log.e("", "faccio partire il services");
    startService(new Intent(this, ServiceLive.class));
    }



    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
    Toast toast = Toast.makeText(getApplicationContext(),
    "Item " + (position + 1) + ": " + liveRow.get(position),
    Toast.LENGTH_SHORT);
    toast.setGravity(Gravity.BOTTOM|Gravity.CENTER_HOR IZONTAL, 0, 0);
    toast.show();
    }

    public void onStop(){
    super.onStop();
    Log.e("", "sono nel metodo onSTOP ");
    }

    @Override
    public void onPause() {
    super.onPause();
    unregisterReceiver(receiverDbf);
    }

    private final BroadcastReceiver receiverDbf = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {

    liveRow = new ArrayList<LiveRowItem>();
    for (int i = 0; i < matchLive.size(); i++) {
    LiveRowItem item = new LiveRowItem( parzialiLive.get(i),minutiDiGioco.get(i),risultati Live.get(i),R.drawable.lente,ControllaLive.this);
    liveRow.add(item);
    }

    listView = (ListView) findViewById(android.R.id.list);
    RowLiveLayout adapter = new RowLiveLayout(ControllaLive.this, liveRow);
    listView.setAdapter(adapter);
    listView.setOnItemClickListener(ControllaLive.this );
    }
    };

    }


    **************************
    SERVICES
    **************************

    package com.myProg.ita.thesis;

    import java.util.ArrayList;
    import java.util.Timer;
    import java.util.TimerTask;
    import android.app.Service;
    import android.content.Intent;
    import android.os.Handler;
    import android.os.IBinder;
    import android.os.Message;
    import android.provider.SyncStateContract.Constants;
    import android.util.Log;

    public class ServiceLive extends Service implements MatchView{

    private Timer timer;
    int cont;

    @Override
    public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
    }
    @Override
    public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();
    cont = 0;
    Log.i("", "servizio avviato");

    TimerTask task = new TimerTask() {
    @Override
    public void run() {
    Log.i("", "sto aggiornando l'activity");
    cont++;
    updateActivity();
    }
    };
    timer = new Timer();
    timer.schedule(task, 0, 20000);
    }

    private void updateActivity(){
    Request request = new Request();
    Extrapolate extrap = new Extrapolate();

    String responce = request.connect();
    extrap.extrapolateData(responce);

    ------------------------------------------>ESTRAPOLO I DATI E AGGIORNO L'ACTIVITY
    Intent intent = new Intent();
    intent.setAction("com.example.updatelist");
    sendBroadcast(intent); // finally broadcast

    }

    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire risposte
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Torna su
Privacy Policy