Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.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
当调用SQLiteOpenHelper时,Android应用程序停止_Android_Garbage Collection_Ksoap2_Sqliteopenhelper - Fatal编程技术网

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

当调用SQLiteOpenHelper时,Android应用程序停止,android,garbage-collection,ksoap2,sqliteopenhelper,Android,Garbage Collection,Ksoap2,Sqliteopenhelper,这是我在SO的第一个问题。所以,我的问题是:我正在为android开发一个应用程序。这就是我的应用程序的流程: 我称之为主要活动 用户按下调用LoginActivity的按钮 用户填写用户名和密码 LoginActivity调用异步任务,为JAX-WS发送数据(我使用ksoap2库调用我的SOAP web服务) 如果信息正确,则调用MenuActivity 有一个“车牌搜索”按钮。当它被按下时,我调用一个活动来输入车牌和一个“OK”按钮来搜索 当按下“OK”按钮时,我发送一个新的异步任务的数据

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

  • 我称之为主要活动
  • 用户按下调用LoginActivity的按钮
  • 用户填写用户名和密码
  • LoginActivity调用异步任务,为JAX-WS发送数据(我使用ksoap2库调用我的SOAP web服务)
  • 如果信息正确,则调用MenuActivity
  • 有一个“车牌搜索”按钮。当它被按下时,我调用一个活动来输入车牌和一个“OK”按钮来搜索
  • 当按下“OK”按钮时,我发送一个新的异步任务的数据,该任务在我的web服务中搜索车牌
  • 如果车牌有效(activity result=OK),我将使用以下内容填充数据库:车牌号、年份、型号和开发商
  • 在此之后,我调用一个名为ResultActivity的新活动,其中a在一个新对话框中显示车辆信息(问题就在这里)
  • 但是,如果结果被取消(当我的web服务没有找到牌照时),我只会向用户显示一个警报。
当我试图向用户显示信息时,问题就出现了。以下是我的结果:

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是一个调用自定义SQLiteOpenHelper类的简单DAO。方法getFirstElement()如下所示:

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

v = vDao.getFirstElement();
UI返回到MenuActivity(因为我通过startActivityForResult()调用了SearchActivity),但当它应该调用ResultActivity时,它停止在那里。
在logcat中,此消息在循环中运行:

D/dalvikvm(28637): GC_CONCURRENT freed 631K, 15% free 18650K/21824K, paused 1ms+4ms, total 25ms<br>
D/dalvikvm(28637):GC_并发释放631K,15%释放18650K/21824K,暂停1ms+4ms,总计25ms
如果我对上面的特定行进行注释,应用程序将“正常”运行并调用结果活动,但信息是空的(当然)。


有人知道我该怎么做吗?

这个循环永远不会终止,因为光标永远不会在循环中前进,并且
isAfterLast()
的返回值也不会改变

while (!cursor.isAfterLast()) {

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

if (cursor.moveToFirst()) {

}

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

谢谢!我想这就是答案。但我有一个疑问:使用:while(cursor.moveToNext()){}而不是:while(!cursor.isAfterLast()){cursor.moveToNext();}?@gcgoll在理论上,除了光标指向最后一行之外,
moveToNext()
可能由于其他原因而失败。但实际上没有什么不同。除此之外,检查可能失败的调用的返回值始终是一种好的做法。
if (cursor.moveToFirst()) {

}