亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

J2ME 進度條與線程化模型實例解析

2019-11-18 12:45:26
字體:
來源:轉載
供稿:網友

  在J2ME的UI體系中,UI操作是在一個獨立的線程中運行的。往往在API中要求程序員對接口方法立即返回。也就是說非阻塞的。你必須開啟一個獨立的線程來完成你自定義的復雜的工作,比如聯網等可能發生阻塞的io操作。新的線程假如不和用戶交流,告訴用戶線程正在工作的話,將會顯現的非常不友好。用戶可能執行別的操作而擾亂程序的正常運行。一個簡單的方法是提供一個進度條,這樣用戶就會愿意等待上一會,直到程序運行出結果。為了將程序員從前臺進度條與后臺線程的通信中解脫出來,專心于后臺線程的開發,有必要設計一個進度條線程模型。
  
  應該注重到進度條有多種的形式:
  動畫形式進度條,僅表示程序正在運行(自維護的)
  可交互增量形式的進度條,后臺線程通過調用進度條的相應方法在程序運行中不斷的改變進度條的狀態
  進度條的表現形式應該靈活,不要固定其實現
  進度條對象要重復利用
   J2ME 進度條與線程化模型實例解析
  進度調和后臺線程的交流也有好幾種情況:
  
  僅僅將進度條繪畫在屏幕上,并等后臺任務完成后,由后臺線程跳轉到成功畫面。
  
  對于可取消的任務,用戶可以通過點擊進度條的按鈕來試圖cancel任務,后臺任務應該盡快取消,并跳轉到失敗的畫面。
  
  對于不可跳轉的任務,用戶只有耐心等待。
  
  假如背景線程運行失敗,應自行跳轉到失敗的屏幕。
  
  進度條的設計(前臺)為了實現進度條的表現的多樣性,首先抽象一個接口:
  
  PRogressObserver.java
  package com.favo.ui;
  import javax.microedition.lcdui.Display;
  
  /**
  * @author Favo
  *
  * 這是仿照Smart Ticket制作的進度條觀察者,這個模型的優點是
  * 1,低耦合度。你可以通過Form,Canvas等來實現這個接口
  * 2,支持可中斷的任務,因為背景線程是無法強制性中斷的,
  * 所以就 沒有了在觀察者中回調背景線程相應方法的必要,
  * 假如支持可中斷的話,可以讓背景線程來查詢觀察者的isStopped()
  * 3,可以說進度條僅僅將自己繪畫在屏幕上,他對后臺線程毫不關心
  */
  public interface ProgressObserver {
  /**
  * 將進度條復位
  */
  public void reset();
  
  /**
  * 將進度條設置最大
  */
  public void setMax();
  
  /*
  * 將自己繪制在屏幕上,假如進度條要開啟自身的線程用于自動更新畫面,
  * 也在這里構造并開啟繪畫線程(常用于動畫滾動條)
  */
  public void show(Display display);
  
  /**
  * 滾動條退出命令,假如進度條曾經開啟自身的線程用于自動更新畫面,
  * (常用于動畫滾動條),在這里關閉動畫線程
  */
  public void exit();
  
  /**
  * 更新進度條
  */
  public void updateProgress(Object param1);
  
  public boolean isStoppable();
  
  public void setStoppable(boolean stoppable);
  
  public boolean isStopped();
  
  public void setStopped(boolean stopped);
  
  public void setTitle(String title);
  
  public void setPrompt(String prompt);
  }
  
  每個方法都很一幕了然,我解釋兩點:
  1)“2,支持可中斷的任務,因為背景線程是無法強制性中斷的,所以就沒有了在觀察者中回調背景線程相應方法的必要, 假如支持可中斷的話,可以讓背景線程來查詢觀察者的isStopped()”
  
  假如要支持可中斷線程的話,想當然的,我們希望用戶按下按鈕后回調后臺線程的某個方法來停止線程,并且這個方法要立即返回(前面提過UI的用戶響應不能夠阻塞)。但是細細想想,線程是無法被強制停止的,而且即使能夠被強制停止也很不安全。所以這個方法也只能夠是通過設置某個flag,然后立即返回。這樣的話線程就和前臺的UI緊密的耦合在一起了。與其這樣,倒不如讓后臺線程去查詢UI的狀態。這樣UI并不關心到底是誰在后臺維護他狀態。
  
  2)假如要實現一個不交互動畫UI,那么顯然這個UI是自維護的(也就是說UI單獨有自己的繪畫線程)。為了能夠實現這種情況,可以在show中開啟線程,在exit中結束線程。對于交互UI,可以簡單的忽略exit方法。
  
  下面給一個利用Form和Gauge實現的交互式UI(非自維護的),讀者可以看看其中的細節,參照他可以設計自己的用Canvas實現的,或者自維護的等等不同的實現。
  
  ProgressGaugeUI.java
  package com.favo.ui;
  
  import javax.microedition.lcdui.Command;
  import javax.microedition.lcdui.CommandListener;
  import javax.microedition.lcdui.Display;
  import javax.microedition.lcdui.Displayable;
  import javax.microedition.lcdui.Form;
  import javax.microedition.lcdui.Gauge;
  
  /**
  * @author Favo
  * Preferences - Java - Code Style - Code Templates
  */
  public class ProgressGaugeUI implements ProgressObserver,
  CommandListener {
  
  private static final int GAUGE_MAX = 8;
  
  private static final int GAUGE_LEVELS = 4;
  
  private static ProgressGaugeUI pgUI;
  
  private Form f;
  
  private Gauge gauge;
  
  private Command stopCMD;
  
  boolean stopped;
  
  boolean stoppable;
  
  int current;
  
  protected ProgressGaugeUI() {
  f = new Form("");
  gauge = new Gauge("", false, GAUGE_MAX, 0);
  stopCMD = new Command("Cancel", Command.STOP, 10);
  f.append(gauge);
  f.setCommandListener(this);
  }
  
  public static ProgressGaugeUI getInstance() {
  if (pgUI == null) {
  return new ProgressGaugeUI();
  }
  return pgUI;
  }
  
  public void reset() {
  current=0;
  gauge.setValue(0);
  stopped=false;
  setStoppable(false);
  setTitle("");
  setPrompt("");
  }
  
  public void updateProgress(Object param1)
  {
  //這里的參數設計為提示語
  current=(current+1)%GAUGE_LEVELS;
  gauge.setValue(current * GAUGE_MAX/GAUGE_LEVELS);
  if(param1!=null && param1 instanceof String){
  setPrompt((String)param1);
  }
  }
  
  public boolean isStoppable() {
  return stoppable;
  }
  
  public void setStoppable(boolean stoppable) {
  this.stoppable = stoppable;
  if(stoppable){
  f.addCommand(stopCMD);
  }else{
  f.removeCommand(stopCMD);
  }
  }
  
  public boolean isStopped() {
  return stopped;
  }
  
  public void setStopped(boolean stopped) {
  this.stopped=stopped;
  }
  
  public void setTitle(String title) {
  f.setTitle(title);
  }
  
  public void setPrompt(String prompt) {
  gauge.setLabel(prompt);
  }
  
  public void commandAction(Command arg0, Displayable arg1)
  {
  if(arg0==stopCMD){
  if(isStoppable())
  stopped=true;
  else{
  setPrompt("can't stop!");
  }
  }
  }
  
  public void show(Display display) {
  display.setCurrent(f);
  }
  public void exit() {
  // 忽略
  }
  public void setMax() {
  gauge.setValue(GAUGE_MAX);
  }
  }
  
  后臺線程的設計
  后臺線程替我們作以下的內容:
  
  1)執行我們的任務runTask()
  2)假如用戶中斷線程,那么runTask()運行完后,將會跳轉到我們指定的失敗屏幕
  3)在最后替我們調用UI.exit()
  
  我們需要做的:
  
  1)提供一個前臺的UI,提供失敗后跳轉的畫面,提供Display的實例
  2)在runTask()中,假如任務完成,手工跳轉失敗畫面
  3)在runTask()中,假如任務失敗,手工跳轉失敗畫面
  4)在runTask()中改變進度欄的狀態。
  5)在runTask()中查詢用戶是否取消,假如用戶取消,應該盡快退出runTask()
  這種模型職責清楚,便于使用。但也有一個缺點:假如用戶取消了任務,但是此時任務接近完成,或者已經完成。后臺線程依然會顯示用戶取消了任務,并將會跳轉到我們指定的失敗屏幕。這時候會產生不一致的情況。為了解決整個問題,程序員可以在runTask()中調用taskComplete()來強制完成任務。這樣即使用戶取消了任務,依然回顯示任務成功。當然你也可以不掉用taskComplete()遵循默認的行為特點。
  
  BackgroundTask.java
  package com.favo.ui;
  
  import javax.microedition.lcdui.AlertType;
  import javax.microedition.lcdui.Displayable;
  import javax.microedition.lcdui.Display;
  import javax.microedition.lcdui.Alert;
  
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲一区二区久久| 亚洲小视频在线观看| 日韩精品中文字幕视频在线| 一区二区av在线| 97超碰国产精品女人人人爽| 久久久亚洲成人| 国产婷婷色综合av蜜臀av| 国产一区二区动漫| 国产精品白丝jk喷水视频一区| 亚洲欧美综合精品久久成人| 久久中文字幕视频| 欧美在线国产精品| 亚洲美女精品久久| 亚洲天堂开心观看| 高清欧美性猛交xxxx| 亚洲aaaaaa| 91av在线播放| 538国产精品一区二区在线| 亚洲aⅴ日韩av电影在线观看| 国产日产欧美a一级在线| 一区二区三欧美| 日韩av三级在线观看| 欧美激情性做爰免费视频| 视频一区视频二区国产精品| 中文字幕九色91在线| 色综合久综合久久综合久鬼88| 亚洲午夜未满十八勿入免费观看全集| 日韩在线观看成人| 亚洲欧美日韩国产中文| 欧美日韩午夜视频在线观看| 亚洲直播在线一区| 伦伦影院午夜日韩欧美限制| 日韩视频在线免费| 色综合老司机第九色激情| 成人福利网站在线观看11| 国产精品欧美一区二区| 国产精品视频免费观看www| 国产a级全部精品| 亚洲免费电影在线观看| 国产日韩中文字幕| 亚洲午夜av久久乱码| 日韩视频欧美视频| 欧美在线性视频| 77777亚洲午夜久久多人| 欧美精品电影免费在线观看| 中文日韩在线观看| 中文字幕精品一区久久久久| 亚洲无亚洲人成网站77777| 黑人巨大精品欧美一区二区| 国语自产精品视频在线看一大j8| 国产精品av网站| 日韩亚洲综合在线| 午夜精品一区二区三区视频免费看| 欧洲永久精品大片ww免费漫画| 欧美视频在线免费| 亚洲偷熟乱区亚洲香蕉av| 91中文字幕一区| 最近2019中文字幕第三页视频| 欧美电影《睫毛膏》| 久久国产精彩视频| 欧美激情亚洲综合一区| 91精品免费久久久久久久久| 日韩av一区二区在线| 欧美在线免费看| 国产精品久在线观看| 懂色av一区二区三区| 亚洲成人久久一区| 欧美日韩国产999| 中文字幕免费精品一区| 成人av资源在线播放| 国产精品va在线| 精品国产一区二区在线| 伊人亚洲福利一区二区三区| 久久亚洲国产精品| 久久91亚洲精品中文字幕奶水| 亚洲国产中文字幕在线观看| 黑人精品xxx一区一二区| 中国china体内裑精亚洲片| 97在线精品国自产拍中文| 国产精品视频yy9099| 国内揄拍国内精品| 日本亚洲欧美三级| 色妞在线综合亚洲欧美| 久久久精品免费视频| 国产精品视频网| 日韩av电影国产| 亚洲最大的免费| 亚洲综合色激情五月| 国产91露脸中文字幕在线| 日韩中文字幕在线视频播放| 久久久久久久一区二区| 人人做人人澡人人爽欧美| 国产视频精品久久久| 亚洲成色999久久网站| 成人免费在线视频网站| 91精品免费久久久久久久久| 日本久久久久亚洲中字幕| 国产精品美女久久久久av超清| 欧美日韩国产一区在线| 热久久99这里有精品| 久久久久久久久综合| 97精品免费视频| 91精品久久久久| 国产主播欧美精品| 国产精品免费视频xxxx| 亚洲性无码av在线| 亚洲精品久久视频| 国内外成人免费激情在线视频网站| 91日韩在线视频| 97在线视频观看| 日韩在线视频线视频免费网站| 色综合色综合久久综合频道88| 国产精品国产自产拍高清av水多| 久久男人av资源网站| 中文精品99久久国产香蕉| 日韩精品免费视频| 欧美性生交大片免费| 91免费看国产| 亚洲国产美女精品久久久久∴| 久久综合电影一区| 黑人极品videos精品欧美裸| 美女久久久久久久| 亚洲香蕉在线观看| 久久久精品久久久久| 久久久亚洲精选| 91精品久久久久久久久久| 久久久久久69| 欧美xxxx14xxxxx性爽| 亚洲护士老师的毛茸茸最新章节| 欧美专区第一页| 日韩精品免费看| 黑人巨大精品欧美一区二区三区| 中文字幕日本欧美| 91色在线观看| 欧美专区国产专区| 在线视频免费一区二区| 欧美激情女人20p| 亚洲精品永久免费| 亚洲精品二三区| 成人信息集中地欧美| 久久久精品一区二区三区| 亚洲国产欧美自拍| 国产精品免费一区| 欧美精品久久久久久久免费观看| 亚洲精品99久久久久中文字幕| 57pao成人永久免费视频| 久久九九亚洲综合| 伦理中文字幕亚洲| 亚洲美女av电影| 日韩中文字幕免费视频| 成人精品视频99在线观看免费| 欧美日产国产成人免费图片| 日韩高清av在线| 日韩亚洲成人av在线| 国产成人精品视频在线| 国产亚洲精品久久久久久777| 亚洲久久久久久久久久久| 欧美成人午夜视频| 欧美成人精品在线播放| 国语自产精品视频在线看一大j8| 国产精品va在线播放我和闺蜜| 成人黄在线观看| 亚洲美女福利视频网站| 日韩久久免费电影|