Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android对话框未正确显示_Java_Android_Android Asynctask_Progressdialog - Fatal编程技术网

Java Android对话框未正确显示

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

下面的代码将应用程序与API连接起来,并从中检索数据,它工作正常,唯一的问题是对话框消失得太快,它必须在同步过程中显示,然后消失

/**
 * 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()
,在执行任务之前在UI线程上调用。此步骤通常用于设置任务,例如在用户界面中显示进度条

  • doInBackground(参数…)
,在onPreExecute()完成执行后立即在后台线程上调用。此步骤用于执行可能需要很长时间的背景计算。异步任务的参数被传递到此步骤。此步骤必须返回计算结果,并将返回到最后一步。此步骤还可以使用publishProgress(进度…)发布一个或多个进度单元。这些值在UI线程的onProgressUpdate(Progress…)步骤中发布

  • onProgressUpdate(进度…)
,在调用publishProgress(Progress…)后在UI线程上调用。执行的时间未定义。此方法用于在后台计算仍在执行时在用户界面中显示任何形式的进度。例如,它可以用于制作进度条动画或在文本字段中显示日志

  • 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();
    }
}