優化程式碼原則--學習筆記
一、單一職責原則
總結來說,一個類中應該是一組相關性秀高的函式 、資料的封裝。也就是說,這一個類,應該僅有一個引起它變化的原因。
以我剛剛寫出的傳送郵件的一個demo為例
private Thread thread = new Thread() {
@Override public void run() {
try { send1(); protocol(); //handler.sendEmptyMessage(0); }
catch (MessagingException e) { e.printStackTrace(); } } };
//定義Handler物件 private Handler handler = new Handler() {
@Override public void handleMessage(android.os.Message m) { super.handleMessage(m); } };
private void protocol() {
try {
session = Session.getInstance(props,null);
Transport transport = session.getTransport("smtp");
transport.connect("smtp.qq.com","1171546977", "beqaofqqwyeqgbff");
Address[] allRecipients = msg.getAllRecipients(); transport.sendMessage(msg,allRecipients);
runOnUiThread(new Runnable() {
@Override public void run() {
((Button)findViewById(R.id.bt_sendEmailByMail)).setText("傳送成功"); } }); }
catch (MessagingException e) { e.printStackTrace(); } finally { } }
private void send1() throws MessagingException {
props = System.getProperties(); props.setProperty("mail.smtp.host", "smtp.qq.com");
props.setProperty("mail.smtp.port", "587"); props.setProperty("mail.smtp.starttls.enable", "true");
props.setProperty("mail.smtp.password", "beqaofqqwyeqgbff"); //
props.setProperty("mail.smtp.timeout", "25"); 不能輕易設定超時 props.put("mail.smtp.auth", "true");
final String username = "1171546977"; final String password = "beqaofqqwyeqgbff";
Session session = Session.getDefaultInstance(props, new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } });
// -- Create a new message -- session.setDebug(true);
msg = new MimeMessage(session); msg.setContent("Hello", "text/plain");
msg.setHeader("Content-Type", "text/html; charset=UTF-8"); // -- Set the FROM and TO fields -- try {
msg.setFrom(new InternetAddress(username + "@qq.com"));
msg.addRecipients(Message.RecipientType.TO, InternetAddress.parse( "[email protected]", false));
msg.setSubject("Title"); msg.saveChanges(); } catch (MessagingException e) { e.printStackTrace(); } }
剛寫完的程式碼 用javamail傳送郵件主要也就這麼幾個步驟 ,定義Email各種屬性,傳送成功或失敗應該執行什麼。當然中間是開啟了執行緒的,根據單一模式原則我決定
修改如下
結果一分為二 分出一個JavaMailHelper類來專門處理javamail的屬性配置 然後加入回撥 使得activity得到它完成傳送後是成功還是失敗的訊號
程式碼如下:
public class JavaMailHelper {
private Session session;
private Message msg;
private Properties props;
private Transport transport;
private OnSendFinishClickListener mListener;
public static boolean connected; public JavaMailHelper() {
transport = null; thread.start(); }
private Thread thread = new Thread(new Runnable() {
@Override public void run() { init(); } });
private void init() {
try { props = System.getProperties();
props.setProperty("mail.smtp.host", "smtp.qq.com");
props.setProperty("mail.smtp.port", "587");
props.setProperty("mail.smtp.starttls.enable", "true");
props.setProperty("mail.smtp.password", "beqaofqqwyeqgbff");
// props.setProperty("mail.smtp.timeout", "25"); 不能輕易設定超時
props.put("mail.smtp.auth", "true");
final String username = "*****************";
final String password = "******************";
session = Session.getDefaultInstance(props, new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password); } });
// -- Create a new message --
session.setDebug(true);
msg = new MimeMessage(session);
msg.setContent("Hello", "text/plain");
msg.setHeader("Content-Type", "text/html; charset=UTF-8");
// -- Set the FROM and TO fields --
try { msg.setFrom(new InternetAddress(username + "@qq.com"));
msg.addRecipients(Message.RecipientType.TO, InternetAddress.parse( "***********@qq.com", false));
msg.setSubject("Title"); msg.saveChanges(); session = Session.getInstance(props, null); setTransport(); } catch (MessagingException e) { e.printStackTrace(); } finally { } } catch (MessagingException e1) { e1.printStackTrace(); } }
public void setTransport() {
try { transport = session.getTransport("smtp");
transport.connect("smtp.qq.com", "*************", "***************");
Address[] allRecipients = msg.getAllRecipients();
transport.sendMessage(msg, allRecipients);
if (mListener != null){
mListener.onSendFinishClick(transport.isConnected()); } } catch (MessagingException e) { e.printStackTrace(); } } //這裡,我們定義一個介面 public interface
OnSendFinishClickListener {
public void onSendFinishClick(boolean connected); } //寫一個設定介面監聽的方法
public void setOnObserveSendStateListener(
OnSendFinishClickListener listener) {
mListener = listener; }
MainActivity
程式碼如下: //兩種傳送郵件方式
private JavaMailHelper javaMailHelper;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
javaMailHelper = new JavaMailHelper(); javaMailHelper.setOnObserveSendStateListener(new JavaMailHelper.OnSendFinishClickListener() {
@Override public void onSendFinishClick(final boolean connected) { runOnUiThread(new Runnable() {
@Override public void run() {
if (connected){ ((Button) findViewById(R.id.bt_sendEmailByMail)).setText("郵件傳送成功"); }
else{ ((Button) findViewById(R.id.bt_sendEmailByMail)).setText("郵件傳送失敗"); } } }); } }); }
程式碼進行梳理後 自己都感覺看著順眼多了,而且自我感覺分工比較明確