2014-07-07 84 views
0

下面的代碼將應用程序與API連接起來,並從那裏檢索數據,它工作正常,唯一的問題是對話框消失得太快,它必須在同步時顯示正在進行然後消失。Android對話框不能正常顯示

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

} 

MainActivity:

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); 


    } 

} 
+0

asynctask是如何被調用的? – Raghunandan

+0

@Raghunandan在我的MainActivity我有一個觸發,當我在同步單擊事件的功能 - 私人無效dispatchSync(){ /* dispara一個sincronizaçãoDOS dados */ SincronizarTask mSincronizarTask =新SincronizarTask(本); mSincronizarTask.execute((Void)null); } – AND4011002849

+0

@WARpoluido只是將其添加到文章 – Typo

回答

1

你應該呼籲onPreExecute方法的對話框,這樣,對話框將在UI線程上執行,像這樣:

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

從Android AsyncTask documentation:

4步驟在任務被執行之前

  • onPreExecute()

,調用UI線程上:當執行一個異步任務,任務經過4個步驟。此步驟通常用於設置任務,例如通過在用戶界面中顯示進度條。

  • doInBackground(參數...)

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

  • onProgressUpdate(進展...)

,以publishProgress(進步...)的調用之後,在UI線程調用。執行的時間是未定義的。此方法用於在後臺計算仍在執行時在用戶界面中顯示任何形式的進度。例如,它可以用來爲進度條設置動畫效果或在文本字段中顯示日誌。

  • onPostExecute(結果)

,背景計算完成後在UI線程上調用。後臺計算的結果作爲參數傳遞給此步驟。

+0

看起來好像你改變了代碼wile我正在輸入一個答案... – Typo

+0

是的,但仍然殺死以加快對話框,它沒有運行,而同步工作 – AND4011002849

+0

@WARpoluido你確定進程isn只是一個短的? – Typo