使用Thread來實現耗時操作和重新整理UI
阿新 • • 發佈:2018-12-30
實現原理:
建立一個Thread物件,然後在其run方法中呼叫runOnUiThread方法,在run中執行耗時操作,在runOnUiThread方法執行耗時操作完成後需要更新的UI,不要忘記呼叫Thread的start方法。我此處是在模擬耗時操作的時候讓其顯示了一個進度條,在耗時操作結束時讓進度條消失,具體邏輯可以更具自己的業務需求。
程式碼:
佈局檔案:import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ProgressBar; public class TestActivity extends Activity { Button btn; ProgressBar progressBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.handler_msg); btn = (Button) findViewById(R.id.button); progressBar = (ProgressBar) findViewById(R.id.progressBar1); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { progressBar.setVisibility(View.VISIBLE); new Thread(new Runnable() { // 開啟一個執行緒處理邏輯,然後線上程中在開啟一個UI執行緒,當子執行緒中的邏輯完成之後, // 就會執行UI執行緒中的操作,將結果反饋到UI介面。 @Override public void run() { // 模擬耗時的操作,在子執行緒中進行。 try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } // 更新主執行緒UI,跑在主執行緒。 TestActivity.this.runOnUiThread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub progressBar.setVisibility(View.GONE); btn.setText("更新完畢!"); } }); } }).start(); } }); } }
佈局雖然很簡單,但是還是粘上了,省的大家自己操作的時候麻煩>-<<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" tools:context="com.ygc.handlerupdateui.MainActivity" > <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/button" android:layout_centerInParent="true" android:text="開始更新"/> <ProgressBar android:id="@+id/progressBar1" style="?android:attr/progressBarStyleLarge" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/button" android:layout_centerHorizontal="true" android:visibility="gone" android:layout_marginBottom="69dp" /> </RelativeLayout>