Java Android对话框未正确显示
下面的代码将应用程序与API连接起来,并从中检索数据,它工作正常,唯一的问题是对话框消失得太快,它必须在同步过程中显示,然后消失Java Android对话框未正确显示,java,android,android-asynctask,progressdialog,Java,Android,Android Asynctask,Progressdialog,下面的代码将应用程序与API连接起来,并从中检索数据,它工作正常,唯一的问题是对话框消失得太快,它必须在同步过程中显示,然后消失 /** * SYNC */ import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.os.AsyncTask; import android.util.Log; import com.databa
/**
* SYNC
*/
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
import com.database.adapter.ClientesAdapter;
import com.model.ClienteModel;
import com.webservice.rest.ClientesRest;
import java.sql.SQLException;
import java.util.List;
public class SincronizarTask extends AsyncTask<Void, Void, Boolean> {
private final ProgressDialog dialog;
private Context ctx;
private ProgressDialog mProgressDialog;
public SincronizarTask(Activity activity) {
ctx = activity;
dialog = new ProgressDialog(ctx);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog.setCancelable(false);
dialog.setIndeterminate(false);
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
dialog.setTitle("Sincronizando");
dialog.setMessage("Aguarde...");
dialog.show();
}
@Override
protected Boolean doInBackground(Void... params) {
Log.i("RM", "doInBackground");
try {
ClientesRest mClientesRest = new ClientesRest(this.ctx);
Log.i("RM", "doInBackground : P1");
mClientesRest.getClientes(new ClientesRest.ClientesRestListener() {
public void clientesReceived(List<ClienteModel> clientes) {
Log.i("RM", "doInBackground : P:2");
// Log.i("RM", String.valueOf(clientes));
Log.i("RM", "doInBackground : P:3");
ClientesAdapter mClientesAdapter = new ClientesAdapter(ctx);
for (int i = 0; i < clientes.size(); i++) {
System.out.println(clientes.get(i).get_nome());
/*
Verifica se o cliente existe no banco de dados local
*/
Integer idClienteBdLocal = null;
try {
idClienteBdLocal = mClientesAdapter.consultaCadastroExistente(clientes.get(i).get_idrm());
} catch (SQLException e) {
e.printStackTrace();
}
if(clientes.get(i).get_status() == "D"){
if(mClientesAdapter.getRegistro(idClienteBdLocal).get_status() != "D"){
try {
mClientesAdapter.atualizar(new ClienteModel(idClienteBdLocal, clientes.get(i).get_idrm(), null, null, null, null, null, null, null, null, null, null, null, null, clientes.get(i).get_status()));
} catch (SQLException e) {
e.printStackTrace();
}
}
}
if (idClienteBdLocal != 0)
{
/*Atualiza o banco de dados local*/
try {
mClientesAdapter.atualizar(new ClienteModel(local, clientes.get(i).get_id(), clientes.get(i).get_name(), clientes.get(i).get_t(), clientes.get(i).get_add(), clientes.get(i).get_nu(), null, clientes.get(i).get_bb(), clientes.get(i).get_ba(), clientes.get(i).get_ci(), clientes.get(i).get_es(), null, clientes.get(i).get_cr(), clientes.get(i).get_mod(), clientes.get(i).get_st()));
} catch (SQLException e) {
e.printStackTrace();
}
}else {
/*Cria registro no banco de dados local*/
try {
mClientesAdapter.adicionar(new ClienteModel(clientes.get(i).get_idrm(), clientes.get(i).get_nome(), clientes.get(i).get_tipo(), clientes.get(i).get_endereco(), clientes.get(i).get_numero(), null, clientes.get(i).get_cep(), clientes.get(i).get_bairro(), clientes.get(i).get_cidade(), clientes.get(i).get_estado(), null, clientes.get(i).get_criado(), clientes.get(i).get_modificado(), clientes.get(i).get_status()));
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
@Override
protected void onPostExecute(final Boolean success) {
if (dialog.isShowing()) {
dialog.dismiss();
}
}
@Override
protected void onCancelled() {
dialog.dismiss();
}
}
您应该调用onPreExecute方法上的对话框,这样对话框将在UI线程上执行,如下所示:
@Override
protected void onPreExecute() {
super.onPreExecute();
if (!dialog.isShowing()) {
dialog.show();
}
}
从Android异步任务
四个步骤
执行异步任务时,任务将经历4个步骤:
- onPreExecute()
- doInBackground(参数…)
- onProgressUpdate(进度…)
- onPostExecute(结果)
,在后台计算完成后在UI线程上调用。后台计算的结果作为参数传递到此步骤。asynctask是如何调用的?@Raghunandan在我的MainActivity中,我有一个函数,当我单击同步时触发一个事件--private void dispatchSync(){/*dispara a sincronizaço dos dados*/SincronizarTask msincroniartask=new SincronizarTask(this);mSincronizarTask.execute((Void)null);}@WARpoluido只需将其添加到post@boolean已添加完整的主活动。为什么不使用onPreExecute方法打开对话框?是的,但为了加快对话框的速度,它在同步过程中未运行work@WARpoluido你确定这个过程不是很短吗?是的,它很短,但是同步任务大约需要15秒完成,对话框在2秒后消失。我想显示对话框,直到同步任务完成finished@WARpoluido这听起来像是抛出了一个异常,您是否检查了logcat?@WARpoluido也是ProgressDialog是一个自定义类,您应该发布它。
@Override
protected void onPreExecute() {
super.onPreExecute();
if (!dialog.isShowing()) {
dialog.show();
}
}