2015.08.06
自上次实现可用控件显示不同的单词之后,经过自己的调试我终于实现了显示单词的前提工作----读取进度和今日计划.下面分别记录一下:
1.读取进度和今日计划
既然是背单词软件必然需要进行一个最基础也是非常必要的记录----我目前单词背到哪里了?今天我想背多少单词?换句话说我需要记录一下当前的数据库需要从哪里开始更新并且要更新到哪里.摆在我眼前的有两条路走:a.用sharepreference进行配置/b.直接用模拟的办法获取.目前我的这个小程序实现的功能比较单一,也没有多个单词库(只有GRE),所以我认为不需要用a办法,于是尝试的b方案.后面在我重做这个项目的时候我会尝试用sharepreference去记录多个单词库的进度
既然是手动找出更新位置,代码就比较简单.设置一个getTodayLearningParameters()方法就可以满足要求.这里面我只需要获取两个参数:今天开始的位置还有要背的单词数目即可.代码如下
//获取今日计划和开始的位置
public void getTodayLearningParameters(int []WordRepeatedNumber)
{
Intent intent=getIntent();
String tmp=intent.getStringExtra("today_plan");
today_plan=Integer.parseInt(tmp);
today_start_place=0;
<span style="white-space:pre"> </span>for(int i=0;i<3111;i++)
if(WordRepeatedNumber[i]>WordRepeatedNumber[i+1])
{
today_start_place=i+1;
break;
}
}
其中今日计划today_plan用的是上一个控件---欢迎界面里的EditText传过来的数据,而开始位置使用了一个对传往下一个控件的intent里面的临时数据去获取.我实在进行背单词那个按钮上绑定的,为了防止重复调用,我设置了一个flag,像这样:
//获取学习进度
if(para_need_get) {
getTodayLearningParameters(WordRepeatedNumber);
para_need_get=false;}
获取学习进度之后再按照与原来的传递办法就可以在下一个空间中获得数据了,具体的处理在第三部分会完整给出
获取学习进度的同时,我还需要实时更新,但是限于技术能力......(我好像只会这么说...),我选择用一个按钮把当前的新位置传回去,然后在上一个控件里去完成更新的操作.步骤如下
1).首先要将传递到下一个控件的语句由"startActivity"改为"startActivityForResult"
2).复写onActivityResult方法进行更新操作
代码如下:
//更新当前学习进度
@SuppressWarnings("deprecation")
@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==1000&&resultCode==1001)
{
Cursor c=mgr.queryTheCursor();
startManagingCursor(c);
//获取更新需要的参数--开始更新的位置和待更新的单词数目
int end_update_place=data.getIntExtra("next_start_place", today_plan+today_start_place);
int start_update_place=today_start_place;
int total_time=end_update_place>=start_update_place?end_update_place-start_update_place+1:3111+end_update_place-start_update_place+1;
//更新操作,需要判断背完3000单词之后再从头背的情况
c.moveToPosition(start_update_place-1);
int update_time=1;
while(c.moveToNext()&&update_time<=total_time)
{
String tmpString=c.getString(c.getColumnIndex("en_meaning"));
int tmpNumber=c.getInt(c.getColumnIndex("repeating_number"));
mgr.updateRepeating_Number(tmpString,tmpNumber);
update_time++;
}
if(update_time<total_time)
{
c.moveToPosition(-1);
while(c.moveToNext()&&update_time<=total_time)
{
String tmpString=c.getString(c.getColumnIndex("en_meaning"));
int tmpNumber=c.getInt(c.getColumnIndex("repeating_number"));
mgr.updateRepeating_Number(tmpString,tmpNumber);
update_time++;
}
}
//更新当前学习进度,以便继续刷的时候的进度更新
today_start_place=end_update_place+1;
today_plan-=update_time-1;
}
}
这里就是比较原始的逐条更新操作,主要是我目前不知道有没有更有效率的方法(衰)....于是我在真机调试的时候发现如果一次更新的单词过多(800以上)就会黑屏,然后就要过几秒才会完成更新操作,第一次还以为是死机了......只能说----吓死宝宝了!
相应的,需要在开发日记5(上)的基础上重新写一下按钮部分的代码:
//设置返回键去向数据库控件传递参数从而更新数据库
btnBack.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
run=false;
Intent intent=new Intent();
intent.putExtra("next_start_place", next_start_place);
setResult(1001,intent);
finish();
}
});
我设置的requestCode分别是1000和1001,用来分清是那个activity的action.具体数字随便设置,只要不同即可.
3.关于细节的处理
考虑到我不想浪费十秒去记忆我很熟的单词,但是一不想去把他删掉,所以我有设置了一个skip的按钮去跳过这个单词,一开始只是直接postDelay,后来发现间隔就不再是10s了,仔细思考发现是没有把原来的线程销毁掉导致线程重叠了.再加一句销毁原来的线程就ok了;另一方面,新增了循环功能----就是背完一遍从头开始继续下一遍的过程.代码见下:
private final Runnable task = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
next_start_place=k;
EnText.setText("\n" + English[k]);
CnText.setText(""+Chinese[k]);
CountText.setText(""+k);
//设置跳过功能--这个单词如果认识点击按钮直接跳到下一个
btnSkip=(Button)findViewById(R.id.Button04);
btnSkip.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
handler.removeCallbacks(task);//销毁当前线程
handler.postDelayed(task, 1);//重新开始
}
});
if (run&&k<today_plan+today_start_place-1&&k<3112) {
k++;
if(k>3111) {k=0;today_plan=today_plan+today_start_place-3111;today_start_place=0;}
handler.postDelayed(this, 7777);
}
}
};
然后在onCreate方法里面调用handler.postDelay(task,0);就可以了.