背单词App开发日记5(下)

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

获取学习进度之后再按照与原来的传递办法就可以在下一个空间中获得数据了,具体的处理在第三部分会完整给出


2.进度更新

获取学习进度的同时,我还需要实时更新,但是限于技术能力......(我好像只会这么说...),我选择用一个按钮把当前的新位置传回去,然后在上一个控件里去完成更新的操作.步骤如下

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);就可以了.






  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.可实现背四级单词、六级单词、考研单词、托福单词、雅思单词、中考单词、高考单词、新概念单词的功能。 2.四级单词、六级单词、考研单词、托福单词、雅思单词、中考单词、高考单词、新概念单词以一定的格式存储在记事儿本里通过操作进行读取。 3.实现隐藏单词和隐藏释义功能:通过多个timer的相互作用,可以先出来单词,再通过隐藏释义按钮使单词释义若干秒之后再显示单词释义,隐藏单词的功能刚好相反。在此过程中还可以通过加速减速按钮,使单词或者释义加快显现或者减慢显示。其中隐藏单词和隐藏释义不可同时工作。 4.自动功能:用户不用点击下一个按钮,即可在显示此个单词释义后自动播放以一个单词及其释义,此时还可点击加速减速功能来调整单词播放的速度,还可点击隐藏单词或者隐藏释义按钮来使单词或者释义延迟显示达到记忆的目的。 5.乱序功能:使正序字典顺序改为乱序显示下一个单词。 6.程序还有一些细节的处理:人性化界面良好。 7.实现在线翻译的功能:输入中英文后可以直接打开浏览器并跳转至有道翻译进行翻译。 8.实现本地翻译功能:本软件收录了四级单词、六级单词、考研单词、托福单词、雅思单词、中考单词、高考单词、新概念单词释义,可以通过本地搜索的功能翻译中文及英文单词,并显示单词所属单词列表。 9.实现历史记录的功能:不论是手动还是自动的背诵单词,在退出的时候都将会保存背诵记录,通过看历史记录可以直接从上次的断点再次进行背诵。 10.单词收藏及收藏功能:在背诵单词的时候可以单击收藏按钮即将单词收录至收藏本中,可以通过打开收藏本看收藏的功能。在收藏本中还可以继续以娱乐的方式对收藏的单词进行再次记忆。 11.错词记录及错词本功能,在默写单词释义的时候,如果默写出错,软件可以在进行短暂提示后将单词存储在错词本中。打开对应单词的错词本的时候可以看对应的默写出错的单词释义,在错词本中还可以继续对单词进行默写,直到单词释义默写正确后才将单词从错词本中去除。在错词本中,可以通过字典正序及字典乱序的方和出错次数进行排序。 12.程序实现清除收藏本及历史记录的功能。 13.可以设置单词释义的字体及颜色和主背景图片以及听写单词释义时显示时常。 14.本软件还会在启动时检本地安装包,若安装包有缺失或损坏时,可以对软件进行修复。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值