>

Fórum

Fórum da RL System, voltado para analistas, programadores etc. Tudo sobre linguagem de programação e desenvolvimento Full Stack: Banco de Dados, Android, C#, Java, .NET, PHP, Node, Javascript, TypeScript, Front, HTML e muito mais.



Replicação só funciona na primeira vez


Rafael, mais um pequeno problema...

Criei a parte de replicar para o banco mysql, só que ele só funciona na primeira vez.

No button está em ONCLICK.

Mas quando eu faço a primeira replicação e ele limpa a lista de vendas, eu cadastro uma nova venda, e mando replicar e não acontece nada.

Nem deleta e nem excluir.

É como se o botão perdesse a funcionalidade.

Não teria que ser fora do onCreate da Classe ExportarVendasService?

Obrigado



22 Respostas


Olá

Onde fica o botão? Pode postar os códigos no fórum? (poste usando as tags).





xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >

android:id="@ id/btnListarVendas"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="listarVendaClick"
android:layout_alignLeft="@ id/btnSair"
android:layout_below="@ id/btnNovaVenda"
android:text="@string/listarvendas" />

android:id="@ id/btnNovaVenda"
android:onClick="novaVendaClick"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="@string/novavenda" />

android:id="@ id/btnReplicar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@ id/btnListarVendas"
android:layout_below="@ id/btnListarVendas"
android:onClick="Replicacao_Click"
android:text="Iniciar Replicação" />

android:id="@ id/btnSair"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@ id/btnNovaVenda"
android:layout_below="@ id/btnReplicar"
android:onClick="closeApp"
android:text="@string/btn_sair" />





código do ExportarVendasService:


package br.danilomarcus.vendas;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.IBinder;
import android.util.Log;

public class ExportarVendasService extends Service implements Runnable {

public void onCreate(){
new Thread(ExportarVendasService.this).start();
}


@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}


@Override
public void run() {

SQLiteDatabase db = openOrCreateDatabase("vendas.db", Context.MODE_PRIVATE, null);
Cursor cursor = db.rawQuery("SELECT * from vendas", null);
int totalDB = cursor.getCount();
int totalReplicado = 0;

while(cursor.moveToNext()){

StringBuilder strURL = new StringBuilder();

strURL.append("http://192.168.1.3/inserir.php?produto=");
strURL.append(cursor.getInt(cursor.getColumnIndex("produto")));
strURL.append("&preco=");
strURL.append(cursor.getDouble(2));
strURL.append("&latitude=");
strURL.append(cursor.getDouble(3));
strURL.append("&longitude=");
strURL.append(cursor.getDouble(4));

Log.d("ExportarVendasService",strURL.toString());
try{
URL url = new URL(strURL.toString());
HttpURLConnection http = (HttpURLConnection) url.openConnection();

InputStreamReader ips = new InputStreamReader(http.getInputStream());

BufferedReader line = new BufferedReader(ips); // pega a linha inteira e não char por char

String linhaRetorno = line.readLine();
if(linhaRetorno.equals("Y") ){
db.delete("vendas", "_id=?", new String[]{String.valueOf(cursor.getInt(cursor.getColumnIndex("_id")))});
totalReplicado ;
Log.d("ExportarVendasService","OK");
}
}catch(Exception ex){

Log.d("ExportarVendasService",ex.getMessage());
}
}

db.close();
if(totalDB == totalReplicado){

}

}

}




Mas ele libera o processo do botão? O botão não pode ser mais clicado? Mas, neste caso, ele ja chegou a finalizar a replicação?




A replicação só funciona uma vez! E na vez que funciona, faz certinho!

O botão permanece clicável, porém sem funcionalidade.

Quanto ao processo do botão, acho que ele não finaliza para refazer a operação!

o onClick deveria fazer a replicação toda vez que clicar, correto?

Fico no seu aguardo!

Obrigado

Danilo Marcus




Danilo,

Desculpe a demora.

Mas ele não entra no botão não é porque não tem mais dados a ser replicado?




Só que eu chego a cadastrar novos, após fazer a replicação pela primeira vez. Aí na segunda replicação ele nem chama o método para exportar!




Como eu faço para uma tela iniciar com uns botões invisível e ao clicar um botão Visível os invisíveis ficam visíveis?




Marcus, amigo, seria possível abrir outro post para sua dúvida?
De qualquer forma você precisa resgatar o button que você quer desativar em um método qualquer do onClick do button que está ativado e no próprio findViewById(R.id.id_do_button).setEnable(false); para desativar e setenable(true) para ativar.




Danilo,

Vamos la.

Mas o botão fica ativo?

Pode me mostra o código que esta a programação do botão?

Ou seja, a Main?




Sim, o botão continua ativo!




Não consigo postar todo o código!





public void novaVendaClick(View v){
startActivity(new Intent(getBaseContext(),NovaVendaActivity.class));
}
public void listarVendaClick(View v){
startActivity(new Intent(getBaseContext(),ListarVendasActivity.class));
}
public void closeApp(){

}
public void Replicacao_Click(View v){
startService(new Intent("br.danilomarcus.iniciar_servico"));
}




Danilo, A principio tudo normal. Não tem jeito. Me envie o código completo via ZIP para eu abrir no meu eclipse. Pode ser?




http://rlsystem.com.br/forum/disco/uploads/3bcd1c604f4cae3a3cf909d972f416ec-Vendas_danilo.rar




Danilo,

Eu realmente não encontrei erro.

Agora o que notei é, depois que você replica ele não irá entrar mais no while, porque não existe mais registro.

Faça o seguinte, tire o onResume, dali, ele pode ta perdendo a conexão e desabilitando o botão.

Ai teste novamente.




Danilo,

Estava com o mesmo problema.
so execultava uma unica vez a exportação dos dados.

Resolvi colocando antes de fechar o db um stopService

Seque como resolvi:

NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);

Notification nt = null;

if(totalreg == calculo){
nt = new Notification(R.drawable.ic_launcher, "Status Replicação", System.currentTimeMillis());

nt.flags |= Notification.FLAG_AUTO_CANCEL;

PendingIntent p = PendingIntent.getActivity(this, 0, new Intent(this.getApplicationContext(), MainActivity.class), 0);

nt.setLatestEventInfo(this, "Status Replicação", "A replicação foi feita com sucesso, total: " calculo, p);

} else {
nt = new Notification(R.drawable.ic_launcher, "Status Replicação", System.currentTimeMillis());

nt.flags |= Notification.FLAG_AUTO_CANCEL;

PendingIntent p = PendingIntent.getActivity(this, 0, new Intent(this.getApplicationContext(), MainActivity.class), 0);

nt.setLatestEventInfo(this, "Status Replicação", "A replicação não foi feita com sucesso, total: " calculo " de " totalreg, p);

}

db.close();
stopService(new Intent("teste.replicacao_servicov")); <-- cologue essa linha aqui.


obs: nao sei se esta certo, mas aqui resolveu.

abs.




Obrigado Jose. Abraço. Vou tentar!




Rafael e amigos boa noite.

Uma dúvida, como faço esse serviço ser executado em background automaticamente de tempos em tempos, ou seja, quando o usuário iniciar a aplicação o serviço já roda em background e por exemplo, de 10 em 10 minutos verifica (sem necessidade do usuario clicar no botão iniciar replicação) se existem registros a serem exportados ?

Obrigado.

Wesley.




Fala galera! boa noite!

Acredito que tem a ver com service e threads. Aí você vai criar o serviço e dentro da função associada a ele vai fazer uma consulta com o Cursor no banco de dados. Caso retorne algum resultado que você pode testar com a função getCount que retorna a quantidade de registros. Se houver registro manda fazer a replicação.

Espero ter ajudado. Vou dar uma fuçada nessa parte aqui e caso você consiga algum avanço vamos nos falando!

Abraço

Danilo Marcus




Opa

Wesley,

Veja a aula do curso de Android Best practices, onde falo do AlarmManager.




Danilo,

Resolveu seu problema?