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