Tecnologia do Blogger.
RSS

Re: [androidbrasil-dev] Atualizar ListView usando Service

package side.com.br.side;

import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;


public class MainActivity extends AppCompatActivity implements Myservice.FilmsConpleteListener{

private Myservice myservice;
private boolean ServiceIsStarted =false;
private ListView listView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = findViewById(R.id.listView);






}



@Override
protected void onStart() {
super.onStart();
Intent intent = new Intent(this,Myservice.class);
startService(intent);
bindService(intent,serviceConection,this.BIND_AUTO_CREATE);
}

@Override
protected void onStop() {
super.onStop();
if(ServiceIsStarted){
myservice.removelistiner(MainActivity.this);
unbindService(serviceConection);
ServiceIsStarted = false;
}
}

private ServiceConnection serviceConection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {

Myservice.ServiceBinder serviceBinder = (Myservice.ServiceBinder) service;
// obtem a instancia do service
myservice = serviceBinder.getService();
// adiciona a intancia da classe que implementa o metodo a ser chamado quando o dawnload dos dados terminar
myservice.setListiners(MainActivity.this);

ServiceIsStarted = true;


}

@Override
public void onServiceDisconnected(ComponentName name) {

}
}

@Override
// este metodo é chamado todas vez que os dados do service estiverem prontos para serem lidos.No seu caso ,quando o listView estiver preenchido com os dados
public void OnFilmsConplete(ListView listView) {
//aqui vc implementa a logica para atualizar a interface
}
}
package side.com.br.side;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

/**
* Created by jonathan.souza on 31/05/2017.
*/

public class Myservice extends Service

{
private IBinder mBinder = new ServiceBinder();
private ListView listView;
private List<FilmsConpleteListener> listeners = new ArrayList<FilmsConpleteListener>();

@Nullable
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}




public void baixarFilmes(ListView listView){
// baixa a lista de filmes e quando finalizar chama o listiner registrado
for(FilmsConpleteListener listener:listeners){

listener.OnFilmsConplete(getListView());
}

}

public void setListiners(FilmsConpleteListener listener){
listeners.add(listener);

}
public void removelistiner(FilmsConpleteListener listener){
listeners.remove(listener);
}

public ListView getListView() {
return listView;
}

public class ServiceBinder extends Binder {

Myservice getService(){
return Myservice.this;
}


}

public interface FilmsConpleteListener{

void OnFilmsConplete(ListView listView);

}


}

Boa noite amigo.

Fiz um rascunho de código que demonstra como vc poderia implementar a funcionalidade que vc esta querendo.

Os codes estão em anexo.

 Espero que ajude,porem saliento que eu no seu ligar não passaria a responsabilidade de manipular o listView para o service,visto que isto poderia trazer comportamentos inesperados ou uma codificação excessiva para sua aplicacao.

Em 31 de mai de 2017 13:31, "Pedro Clericuzi" <clericuzip@gmail.com> escreveu:
Basicamente, o que eu queria era passar como parâmetro o próprio widget ListView, como eu fiz na AsyncTask da seguinte maneira:

public class MainActivity extends AppCompatActivity {
Intent it;
private ListView listView;
private final String urlJson = "filmes.json";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.lista_filmes);
}

@Override
protected void onResume() {
super.onResume();
new ConteudoSync(listView, MainActivity.this).execute(urlJson);
}

@Override
protected void onDestroy() {
super.onDestroy();
stopService(it);
}
}

O que eu fiz na classe MainActivity, foi basicamente chamar o onResume com o asynctask e na classe async fiz o seguinte:

public class ConteudoSync extends AsyncTask<String, Void, String> {
String conteudo = "";
BaixarFilme baixarLivro = new BaixarFilme();
ClassParser classParser = new ClassParser();

private ListView listView;
private final Context context;
public ConteudoSync(ListView listView, Context context){
super();
this.listView = listView;
this.context = context;
}

@Override
protected String doInBackground(String... params) {

try {
            //Aqui eu to passando a url para a classe ListaFilmes que vai me retornar o conteudo do arquivo json
conteudo = baixarLivro.ListaFilmes(params[0]);
} catch (IOException e) {
e.printStackTrace();
}
return conteudo;
}

@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}

@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
try {
            //Aqui é onde eu estou fazendo o parser da string json e colocando na lista
ArrayList<modelJSON> arrayList = classParser.Parser(s);
ListAdapter a = new adapter_parse(context, arrayList);
listView.setAdapter(a);
} catch (JSONException e) {
e.printStackTrace();
}
}
}

E dessa forma que eu esperava fazer:
@Override
protected void onResume() {
super.onResume();
//A classe ServiceLoading é minha classe responsável pelo Service da aplicação
it = new Intent(this, ServiceLoading.class);
it.putExtra("listView", listView)
startService(it);
} 

Em quarta-feira, 31 de maio de 2017 13:00:36 UTC-3, Jonathan souza aguiar escreveu:
Não sei se entendi muito bem,mas vou tentar ajudar com o que eu entendi.

Voce poderia enviar os dados de seu service atravez de um intent para a sua activity, onde vc registraria um BroadcastReceiver responsavel por extrair os dados deste intent e adapta-los  em seu listView. 

O ideal é que somente a activity manipule a interface.


Em 31 de mai de 2017 11:23, "Pedro Clericuzi" <cleri...@gmail.com> escreveu:
Olá pessoal, 

Eu tenho feito alguns exercícios esses dias que consiste em pegar dados a partir de um JSON e jogar numa ListView. Consegui fazer isso tranquilo usando AsyncTask, o problema é que, para funfar, na classe Async eu usei um construtor passando uma ListView e o contexto e na classe eu só precisei settar os valores pro adapter e pronto. Porém, o mesmo eu não posso fazer para um Service, não posso criar um construtor, teria que passar através da Intent, mas o putExtra não recebe widget como parâmetro. Teria alguma maneira de passar essa listview pro Service ou alguma forma melhor, e mais recomendável, de atualiza-la?

Obrigado!

--
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-dev+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-dev+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • RSS

0 comentários:

Postar um comentário