Android 進度暫停和繼續
目錄

Android 進度暫停和繼續.png
前言
上一篇文章實現了Java執行緒的暫停和繼續,那麼我們接下來就應該在Android 當中通過介面的顯示來清楚明白的讓大家看到暫停和繼續。
實現效果

Thread.gif
正文
定義執行緒方法
public class MyThread extends Thread{ private final Object object = new Object(); private boolean pause = false; private int Max = 0; /* *設定暫停 為 ture */ public void pauseThread() { pause = true; } /* * 設定暫停為false,並繼續 */ public void rsumeThread() { pause = false; synchronized (object) { object.notify(); } } /* *暫停方法 */ public void onPause() { synchronized (object) { try { object.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } @Override public void run() { super.run(); int index = 1; while (true) { while (pause) { onPause(); } try { if (index <= 100) { MsgHandleUtil.getInstance().sendNormalMsg(1, null, index);//通過回調發送訊息到UI介面並更新UI System.out.println("index = " + index); sleep(1000); index++; } } catch (InterruptedException e) { e.printStackTrace(); break; } } } }
和上一篇文章基本一樣,但是在這個類中我們加入了相應的方法來進行資料的傳遞,我們建立了相應的類 MsgHandleUtil
類,該類對資料進行了分類和使用
定義回撥方法和訊息傳送方法
首先看一定義的回撥介面類 I_MsgCallBack
public interface I_MsgCallBack { void msgCallBack(int what,Object obj,int ... arg); }
以上就是一個介面類的方法,我們可以在相應的方法中進行實現就OK了,那麼這邊可以先放著,稍後會在實現的時候去說明;
接下來就是訊息傳送方法類 MsgHandleUtil
public class MsgHandleUtil { private I_MsgCallBack callBack = null; private static MsgHandleUtil errUtil = new MsgHandleUtil(); private MsgHandleUtil() { } public static MsgHandleUtil getInstance() { return errUtil; } public void init(I_MsgCallBack callBack) { this.callBack = callBack; } public void sendNormalMsg(int what, Object obj, int... arg) { if (arg.length == 1) { callBack.msgCallBack(what, obj, arg[0]); } else if (arg.length == 2) { callBack.msgCallBack(what, obj, arg[0], arg[1]); } else { callBack.msgCallBack(what, obj); } } }
以上只是簡單的使用了 單例模式
,簡單的說明一下,單例模式就是可以通過方法獲取到類的物件,真正的單例模式需要考慮很多東西,如:這個類只能有一個物件,所有呼叫的都是這一個物件。當然我這個不需要,所以就沒有這樣寫, init()
方法,是需要在相應的方法初始化一下 callback
方法,初始化後就可以正常使用回調了,最後一個方法就是通過回撥進行資料的傳輸 sendNormalMsg()
,其中的引數相當於 Handler
中 msg
的方法一一對應的.
介面的實現
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.testthread.MainActivity" > <ProgressBar android:id="@+id/progressbar" style="@android:style/Widget.ProgressBar.Horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:max="100" android:progress="0" /> <Button android:id="@+id/pause" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/progressbar" android:text="暫停" /> <Button android:id="@+id/continued" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/pause" android:text="繼續" /> </RelativeLayout>
其中就是一個 progressbar
和兩個 button
;
MainActivity()
ublic class MainActivity extends ActionBarActivity implements OnClickListener,I_MsgCallBack{ private Button continued, pause; private ProgressBar bar; private static MainActivity activity = null; private MyThread myThread = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MsgHandleUtil.getInstance().init(this);//初始化回撥方法 continued = (Button) findViewById(R.id.continued); pause= (Button) findViewById(R.id.pause); bar = (ProgressBar) findViewById(R.id.progressbar); updateUI(); continued.setOnClickListener(this); pause.setOnClickListener(this); } /* *更新UI,建立執行緒,並對執行緒進行操作 */ private void updateUI() { if (myThread == null) { myThread = new MyThread(); } Thread thread = new Thread(myThread); thread.start(); } @Override public void onClick(View arg0) { switch (arg0.getId()) { case R.id.continued: //繼續 myThread.rsumeThread(); break; case R.id.pause: //暫停 myThread.pauseThread(); break; default: break; } } /* *通過回撥方法對資料進行傳送 */ @Override public void msgCallBack(int what ,Object obj, int... arg) { Message msg = new Message(); msg.obj = obj; msg.what = what; if (arg.length == 1) { msg.arg1 = arg[0]; } else if (arg.length == 2) { msg.arg1 = arg[0]; msg.arg2 = arg[1]; } handler.sendMessage(msg); } /* * Handler 方法,接收回調的方法 */ private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case 1: //對UI進行更新 bar.setProgress(msg.arg1); break; default: break; } } }; }
以上就是主方法了,那麼首先就是實現了回撥介面和 OnClick
介面,並在 onCreat
方法中對傳送資訊的回撥方法進行了初始化; msgCallBack
就是具體實現了回撥的方法,大家可以詳細的看一下與 Handler
中的 msg
相對應;
Handler
中對就收到的資料分析,設定更新UI;
最後
注意:
-
耗時操作必須在子執行緒中完成
-
不能在子執行緒中宣告主執行緒的屬性
-
更新UI的操作需要通過
Handler
來進行;
希望大家可以自己動手做一遍,我在做的時候發現了很多執行緒中的困難和報錯,查詢了很多資料才發現不能這樣做,需要那樣做,所以還是動手操作一遍比較好!!謝謝大家