標籤:
非同步跟新UI:
1、handler+Thread(runnable):如果handler和Thread都寫在了一個Java檔案中,就不說了,如果runnable定義在了一個單獨的類檔案中,可以通過在構造方法裡接收handler參數,然後執行完耗時操作後,通過handler發送訊息來通知主UI線程更新UI
2、介面回調,定義一個介面,然後在主UI執行耗時操作的時候,藉助匿名內部類,在這裡寫非同步線程返回來的資料處理操作,非同步線程接收一個匿名的內部類執行個體,然後在執行完耗時操作後回調介面的方法,可以把耗時的操作的結果返回給回呼函數
1的代碼實現:
package com.example.testtesttest;import org.json.JSONArray;import com.example.testtesttest.DataRunnable.dataCallBackLisener;import android.os.Bundle;import android.os.Handler;import android.app.Activity;import android.app.FragmentTransaction;import android.content.DialogInterface;import android.content.DialogInterface.OnClickListener;import android.support.v4.app.FragmentManager;import android.util.Log;import android.view.Menu;import android.view.View;import android.widget.Button;public class MainActivity extends Activity implements android.view.View.OnClickListener{ private Button button = null; private dataCallBackLisener callbackListener ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button) findViewById(R.id.button); button.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.button: DataRunnable runnable = new DataRunnable(handler); Thread thread = new Thread(runnable); thread.start(); break; default: break; } } public Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { switch (msg.what) { case 1: button.setText("hhh"); break; default: break; } }; }; }
package com.example.testtesttest;import android.os.Handler;public class DataRunnable implements Runnable{ private String[] dataString = new String[5]; private dataCallBackLisener listener; private Handler dataHandler; public DataRunnable(dataCallBackLisener alistener){ this.listener =alistener; } public DataRunnable(Handler aHandler){ this.dataHandler =aHandler; } @Override public void run() { // TODO Auto-generated method stub for(int i =0 ; i <5;i++) { dataString[i] = i+""; } dataHandler.sendEmptyMessage(1); //listener.dataCallback(dataString); } public interface dataCallBackLisener{ public void dataCallback(String[] str); }}
2的代碼實現:
package com.example.testtesttest;import org.json.JSONArray;import com.example.testtesttest.DataRunnable.dataCallBackLisener;import android.os.Bundle;import android.os.Handler;import android.app.Activity;import android.app.FragmentTransaction;import android.content.DialogInterface;import android.content.DialogInterface.OnClickListener;import android.support.v4.app.FragmentManager;import android.util.Log;import android.view.Menu;import android.view.View;import android.widget.Button;public class MainActivity extends Activity implements android.view.View.OnClickListener{ private Button button = null; private dataCallBackLisener callbackListener ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);/* JSONArray json = new JSONArray(); for(int i =0 ; i<4 ; i++){ json.put(i); } String[] a = {"1","2","3"}; Log.e("Loooooooooook",a.toString());*/ button = (Button) findViewById(R.id.button); button.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.button: DataRunnable runnable = new DataRunnable(new dataCallBackLisener() { @Override public void dataCallback(String str) { // TODO Auto-generated method stub Log.e("hahahaahahahah", str.toString()); button.setText(str.toString()); //更新UI } }); runOnUiThread(runnable); /*DataRunnable runnable = new DataRunnable(handler); Thread thread = new Thread(runnable); thread.start();*/ /*AnotherFragment fragment = new AnotherFragment(); android.app.FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction transaction = fragmentManager. beginTransaction(); transaction.replace(R.id.right_layout, fragment); transaction.commit();*/ break; default: break; } } public Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { switch (msg.what) { case 1: button.setText("hhh"); break; default: break; } }; }; }
package com.example.testtesttest;import android.os.Handler;public class DataRunnable implements Runnable{ private StringBuilder dataString = new StringBuilder(); private dataCallBackLisener listener; private Handler dataHandler; public DataRunnable(dataCallBackLisener alistener){ this.listener =alistener; } public DataRunnable(Handler aHandler){ this.dataHandler =aHandler; } @Override public void run() { // TODO Auto-generated method stub for(int i =0 ; i <5;i++) { dataString.append(i); } //dataHandler.sendEmptyMessage(1); listener.dataCallback(dataString.toString()); } public interface dataCallBackLisener{ public void dataCallback(String str); }}
注意2中,thread必須是UIthread,這樣才能更新主UI的控制項
最後對回呼函數的理解部落格:
http://www.zhihu.com/question/19801131
http://www.jianshu.com/p/cd35ce823602
http://www.bkjia.com/Androidjc/853632.html
最後一篇講了名詞:介面對象???不懂。。。。
安卓 非同步線程更新Ui