调用SQLiteOpenHelper时,Android应用程序停止

时间:2013-10-14 14:33:16

标签: android garbage-collection ksoap2 sqliteopenhelper

这是我在SO的第一个问题。所以,这是我的问题:我正在为Android开发一个应用程序。这就是我的应用程序的流程:

  • 我称之为MainActivity;
  • 用户按下一个调用LoginActivity的按钮;
  • 用户填写用户名和密码;
  • LoginActivity调用AsynchronousTask来发送JAX-WS的数据(我使用kso​​ap2库来调用我的SOAP Web服务);
  • 如果信息正确,则调用MenuActivity;
  • “车牌搜索”按钮。当按下它时,我调用一个活动来输入牌照和一个“确定”按钮进行搜索;
  • 按下“确定”按钮后,我发送一个新的AsynchronousTask数据,用于搜索我的网络服务中的牌照;
  • 如果牌照是有效的(活动结果= OK),我用我的数据库填充:车牌号码,年份,型号和开发人员;
  • 在此之后,我打电话给一个名为ResultActivity的新活动,其中一个新的对话框显示车辆信息(这里是问题);
  • 但是,如果结果是CANCELED(当我的网络服务没有找到牌照时),我只是为用户显示警告。

当我尝试向用户显示信息时,问题就出现了。这是我的ResultActivity:

public class ResultadoBuscaPlacaActivity extends Activity {

    private VeiculoDAO vDao;

    TextView campoPlaca;
    TextView campoModelo;
    TextView campoMarca;
    TextView campoAno;
    TextView campoRenavam;
    TextView campoProprietario;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_resultado_busca_placa);            
        campoPlaca = (TextView) findViewById(R.id.valor_placa);
        campoModelo = (TextView) findViewById(R.id.valor_modelo);
        campoMarca = (TextView) findViewById(R.id.valor_marca);
        campoAno = (TextView) findViewById(R.id.valor_ano);
        campoRenavam = (TextView) findViewById(R.id.valor_renavam);
        campoProprietario = (TextView) findViewById(R.id.valor_proprietario);    
        vDao = new VeiculoDAO(this);
        vDao.open();    

    }

    public void confirm(View v){        
        finish();
    }       

    @Override
    protected void onStart() {      
        super.onStart();
        Veiculo v = new Veiculo();
        v = vDao.getFirstElement();
        if (v.getPlaca()!=null){
            campoPlaca.setText(v.getPlaca());
            campoModelo.setText(v.getModelo());
            campoMarca.setText(v.getMarca());
            campoAno.setText(v.getAno());
            campoRenavam.setText(v.getRenavan().toString());
            campoProprietario.setText(v.getNomeProprietario());
        }           
    }

    @Override
    protected void onDestroy() {
        vDao.close();
        super.onDestroy();
    }

    @Override
    protected void onPause() {
        vDao.close();
        super.onPause();
    }    
}

VeiculoDAO是一个简单的DAO,它调用Custom SQLiteOpenHelper类。方法getFirstElement()在这里:

public Veiculo getFirstElement(){

        Cursor cursor = database.query(CustomSQLiteOpenHelper.TABLE_VEICULO,
                columns, null, null, null, null, null);
        cursor.moveToFirst();
        Veiculo v = new Veiculo();

        while (!cursor.isAfterLast()) {

            v.setAno(cursor.getInt(cursor.getColumnIndex(CustomSQLiteOpenHelper.COLUMN_ANO)));
            v.setMarca(cursor.getString(cursor.getColumnIndex(CustomSQLiteOpenHelper.COLUMN_MARCA)));
            v.setModelo(cursor.getString(cursor.getColumnIndex(CustomSQLiteOpenHelper.COLUMN_MOD)));
            v.setNomeProprietario(cursor.getString(cursor.getColumnIndex(CustomSQLiteOpenHelper.COLUMN_NMPROP)));
            v.setPlaca(cursor.getString(cursor.getColumnIndex(CustomSQLiteOpenHelper.COLUMN_PLACA)));
            v.setRenavan(cursor.getLong(cursor.getColumnIndex(CustomSQLiteOpenHelper.COLUMN_MARCA)));           
        }
        cursor.close();
        return v;
}

实际发生的是:当结果活动调用方法onStart()并转到该行时:

v = vDao.getFirstElement();

用户界面返回到MenuActivity(因为我通过startActivityForResult()调用了SearchActivity)但它停在那里,当它应该调用ResultActivity时。
在logcat中,此消息以循环方式运行:

D/dalvikvm(28637): GC_CONCURRENT freed 631K, 15% free 18650K/21824K, paused 1ms+4ms, total 25ms<br>

如果我评论上面的特定行,应用程序“正常”运行并调用结果活动,但信息是空的(当然)。

有谁知道我该怎么做?

1 个答案:

答案 0 :(得分:1)

此循环永远不会终止,因为游标永远不会在循环内前进,isAfterLast()的返回值不会改变。

while (!cursor.isAfterLast()) {

}

由于您只对第一个结果感兴趣,请将其更改为

if (cursor.moveToFirst()) {

}

您可以将之前的moveToFirst()电话删除为冗余电话。检查返回值仍然很重要,因为可能没有结果行,然后moveToFirst()返回false。