簡體   English   中英

Android對話框無法正確顯示

[英]Android dialog box not showing properly

以下代碼將應用程序與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();
    }

}

主要活動:

public class MainActivity extends SherlockFragmentActivity {

    private ActionBar barra;
    private ViewPager mViewPager;
    private TabsAdapter mTabsAdapter;

    private Preferencias mPreferencias;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        /* Verifica se tem uma sessão */
        mPreferencias = new Preferencias(getApplicationContext());
        Toast.makeText(getApplicationContext(), mPreferencias.getRmSessionEmail(), Toast.LENGTH_SHORT).show();

        mViewPager = new ViewPager(this);
        mViewPager.setId(R.id.pager);
        setContentView(mViewPager);

        barra = getSupportActionBar();
        barra.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
//        barra.setDisplayShowHomeEnabled(false); /* retira a barra */
//        barra.setDisplayShowTitleEnabled(false); /* retira o texto da barra */

        mTabsAdapter = new TabsAdapter(this, mViewPager);
        mTabsAdapter.addTab(barra.newTab().setIcon(R.drawable.agenda).setText(" Agenda"), jbkbjk.class, null);
        mTabsAdapter.addTab(barra.newTab().setIcon(R.drawable.viagens).setText(" Viagens"), jnjn.class, null);
        mTabsAdapter.addTab(barra.newTab().setIcon(R.drawable.clientes).setText(" Clientes"), ki.class, null);
        mTabsAdapter.addTab(barra.newTab().setIcon(R.drawable.pedidos).setText(" Pedidos"), popo.class, null);


    }

    private static final int REFRESH = 1;
    private static final int SEARCH = 2;

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getSupportMenuInflater();
        inflater.inflate(R.menu.activity_itemlist, menu);

        menu.add(0, REFRESH, 0, "Refresh")
                .setIcon(R.drawable.ic_action_view_as_grid)
                .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);


        menu.add(0, SEARCH, 0, "Search")
                .setIcon(R.drawable.ic_action_search)
                .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case REFRESH:

                return true;
            case SEARCH:
                // Do search
                return true;
            case R.id.add_item:
                this.dispatchSync();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    private void dispatchSync(){

         /* dispara a sincronização dos dados */
        SincronizarTask mSincronizarTask = new SincronizarTask(this);
        mSincronizarTask.execute((Void) null);


    }

}

您應該在onPreExecute方法上調用對話框,這樣該對話框將在UI線程上執行,如下所示:

@Override
protected void onPreExecute() {
    super.onPreExecute();
 if (!dialog.isShowing()) {
        dialog.show();
    }
}

從Android AsyncTask 文檔中:

4個步驟執行異步任務時,該任務將經歷4個步驟:

  • onPreExecute()

,在執行任務之前在UI線程上調用。 此步驟通常用於設置任務,例如,通過在用戶界面中顯示進度欄。

  • doInBackground(參數...)

,在onPreExecute()完成執行后立即在后台線程上調用。 此步驟用於執行可能需要很長時間的后台計算。 異步任務的參數將傳遞到此步驟。 計算結果必須通過此步驟返回,並將傳遞回最后一步。 此步驟還可以使用publishProgress(Progress ...)發布一個或多個進度單位。 這些值在onProgressUpdate(Progress ...)步驟中發布在UI線程上。

  • onProgressUpdate(進度...)

,在調用publishProgress(Progress ...)之后在UI線程上調用。 執行的時間是不確定的。 此方法用於在后台計算仍在執行時在用戶界面中顯示任何形式的進度。 例如,它可用於為進度欄設置動畫或在文本字段中顯示日志。

  • onPostExecute(結果)

,在后台計算完成后在UI線程上調用。 后台計算的結果作為參數傳遞到此步驟。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM