>
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
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?