标签:
未进行优化的代码:
实现功能要点:
1. 当输入用户密码后点击登录时,首先判断是否勾选了复选框,若勾选了,将用户名、密码通过文件写的方法写入到内部存储info.txt中。
2. 当应用启动后,执行函数readAccount()函数,该函数通过文件读方法(只获取一行)并将该行字符串分割后显示在用户名和密码框中。
代码如下:
package com.swust.intern; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStreamReader; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.CheckBox; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //应用启动后,读取存档的用户名和密码 readAccount(); } public void readAccount(){ File file =new File("data/data/com.swust.intern/info.txt"); try{ FileInputStream fis =new FileInputStream(file); //把字节流转化为字符流 BufferedReader br =new BufferedReader(new InputStreamReader(fis)); //读取txt文件的用户名和密码 //读取一行 String text =br.readLine(); //使用“##”标识切割,得到字符串数组 String[] s = text.split("##"); EditText et_name = (EditText) findViewById(R.id.et_name); EditText et_pwd = (EditText) findViewById(R.id.et_pwd); et_name.setText(s[0]); et_pwd.setText(s[1]); }catch (Exception e){ e.printStackTrace(); } } public void login(View v){ EditText et_name = (EditText) findViewById(R.id.et_name); EditText et_pwd = (EditText) findViewById(R.id.et_pwd); CheckBox cb = (CheckBox)findViewById(R.id.cb); String name=et_name.getText().toString(); String pwd =et_pwd.getText().toString(); //判读复选框是否被勾选 if(cb.isChecked()){ //"data/data/com.swust.intern"是内部存储空间路径 File file =new File("data/data/com.swust.intern/info.txt"); FileOutputStream fos; try{ fos = new FileOutputStream(file); //加“##”是为了读取时好分割 fos.write((name + "##" +pwd).getBytes()); fos.close(); }catch (Exception e){ e.printStackTrace(); } } //System.out.println("登陆成功"); //创建吐司对话框 /* 第一个参数上context,而activity本来就是context的子类,所以直接填this*/ /*第三个参数为持续显示时间,只有LENGTH_SHORT(2S)和LENGTH_LONG(5s)两种选择*/ /*Toast t= Toast.makeText(this, "登陆成功", Toast.LENGTH_SHORT); //显示吐司对话框 t.show();*/ Toast.makeText(this, "登陆成功", Toast.LENGTH_SHORT).show(); } }
当然,有缺点:
第一,代码不够优化,findById方法实现多次,应该使用全局变量来解决。
第二,逻辑漏洞,1.当该应用第一次启动时,是无法读取账号密码的
2.当用户在之后的某一次不选择记住账户名和密码,那么应该将txt文件清空,而不是之前的旧账号密码
优化解决(代码优化和第一次启动判断文件存在):
package com.swust.intern; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStreamReader; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.CheckBox; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { private EditText et_name; private EditText et_pwd; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //已经是全局变量,应用启动时获取ID et_name = (EditText) findViewById(R.id.et_name); et_pwd = (EditText) findViewById(R.id.et_pwd); //应用启动后,读取存档的用户名和密码 readAccount(); } public void readAccount(){ File file =new File("data/data/com.swust.intern/info.txt");
//判读文件是否存在
if(file.exists()){
try{
FileInputStream fis =new FileInputStream(file);
//把字节流转化为字符流
BufferedReader br =new BufferedReader(new InputStreamReader(fis));
//读取txt文件的用户名和密码
//读取一行
String text =br.readLine();
//使用“##”标识切割,得到字符串数组
String[] s = text.split("##");
et_name.setText(s[0]);
et_pwd.setText(s[1]);
}catch (Exception e){
e.printStackTrace();
}
}
} public void login(View v){ CheckBox cb = (CheckBox)findViewById(R.id.cb); String name=et_name.getText().toString(); //直接使用 String pwd =et_pwd.getText().toString(); //判读复选框是否被勾选 if(cb.isChecked()){ //"data/data/com.swust.intern"是内部存储空间路径 File file =new File("data/data/com.swust.intern/info.txt"); FileOutputStream fos; try{ fos = new FileOutputStream(file); //加“##”是为了读取时好分割 fos.write((name + "##" +pwd).getBytes()); fos.close(); }catch (Exception e){ e.printStackTrace(); } } //System.out.println("登陆成功"); //创建吐司对话框 /* 第一个参数上context,而activity本来就是context的子类,所以直接填this*/ /*第三个参数为持续显示时间,只有LENGTH_SHORT(2S)和LENGTH_LONG(5s)两种选择*/ /*Toast t= Toast.makeText(this, "登陆成功", Toast.LENGTH_SHORT); //显示吐司对话框 t.show();*/ Toast.makeText(this, "登陆成功", Toast.LENGTH_SHORT).show(); } }
标签:
原文地址:http://www.cnblogs.com/shuqingstudy/p/4876798.html