1. android 怎樣發送廣播更新ui
更新ui 可以直接在主線程里操作。一般用不到廣播。如果非要用廣播,一般都是服務更新線程才這么做。在服務里注冊/發送廣播。然後在ui線程里接受廣播,執行更新操作。
2. android中如何實現UI的實時更新
1、在主線程中啟動一個子線程
首先,我們需要在主線程中啟動一個子線程,這個比較簡單,直接在MainActivity的onCreate()方法中調用如下方法即可:
java">newThread(mRunnable).start();
2、在子線程中發送Message給Handler
在創建子線程時,我們使用了Runnable介面對象mRunnable。這里,只需要實現Runnable介面,並重寫該介面的run()方法,在run()方法中實現每1秒發送一條Message給Handler即可。具體實現方法如下:
/*
*Function:實現run()方法,每1秒發送一條Message給Handler
*/
privateRunnablemRunnable=newRunnable(){
publicvoidrun(){
while(true){
try{
Thread.sleep(1000);
mHandler.sendMessage(mHandler.obtainMessage());
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
};
3、Handler接收Message通知
最後,我們創建一個Handler對象,用來接收Message通知。在收到Message通知後,完成刷新UI的操作即可。具體實現方法如下:
/*
*Function:實現handleMessage()方法,用於接收Message,刷新UI
*/
privateHandlermHandler=newHandler(){
publicvoidhandleMessage(Messagemsg){
super.handleMessage(msg);
refreshUI();
}
};
4、刷新UI
由以上的代碼可以看出,刷新UI的操作,我們是放在refreshUI()方法中來完成的。refreshUI()方法的實現也很簡單,調用HttpUtils工具類中的getInputStream()方法,獲得圖1所示Web工程的頁面內容輸入流,再將該輸入流轉化為字元串,放入TextView控制項中進行顯示即可。具體實現方法如下:
/*
*Function:刷新UI
*/
privatevoidrefreshUI(){
try{
InputStreaminputStream=HttpUtils.getInputStream();
StringresultData=HttpUtils.getResultData(inputStream);
mTextView.setText(resultData);
}catch(IOExceptione){
e.printStackTrace();
}
}
3. android 中怎麼把sensor封裝成 service來更新ui
提到過一個問題,就是說感應器刷新頻率太快,假如我們要做一個UI中,需要根據方向數據繪制一個一個移動的箭頭,那麼就要太過頻繁的刷新繪制界面散頌,佔用很多的資源,體驗性也會很差,《android 2高級編程》中一個演示測力器的例子,卻無意中給我們提供了一種此情況下刷新UI的解決方案,這下我們就知道了如何防止感應器在界面中過於頻繁的刷新。
下面是自己修改的代碼沖讓鄭,供大家參考
[java] view plain
/*
* @author octobershiner
* 2011 07 27
* SE.HIT
* 這是《Android 2 高級編程》中的一個實例,關於感應器的使用很普通,但是介紹了一種使用感應器的應用如何刷新UI的好辦法,值得學習
* 我添加了一些注釋和onPause方法滑薯
* 一個演示感應器在線程中刷新UI的例子 測力器的應用
* */
package uni.sensor;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.TextView;
public class ForceometerActivity extends Activity{
SensorManager sensorManager;
TextView accelerationTextView;
TextView maxAccelerationTextView;
float currentAcceleration = 0;
float maxAcceleration = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//獲取兩個文本顯示域
accelerationTextView = (TextView)findViewById(R.id.acceleration);
maxAccelerationTextView = (TextView)findViewById(R.id.maxAcceleration);
//獲取sensor服務,選擇加速度感應器
sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
//注冊事件
sensorManager.registerListener(sensorEventListener,
accelerometer,
4. Android service 可以直接更新UI嗎
不可以直接更新UI,但是可以通過幾種方式來更新:
1 廣播。
2 使用binder機制加回調。
3 使用某些系統自帶的回調機制,比如資料庫監聽的回調等等。
5. Android service 可以直接更新UI嗎
參考別的網站:
不可以直接更新UI。
雖然Service也是在主線程工作。但是其無法直接友咐更改ui。
間接的方法有很多顫弊的,可以參考android跨進程通信。
activity綁定Service
handler.sentMessage()
handler.post(new Runnable(){})
BroadcastReceiver
異茄告族步通信機制
6. Android更新Ui的幾種方法和見解
利用Looper更新UI界面
2.AsyncTask利用線程任務非同步更新UI界面
3.利用Runnable更新UI界面
7. android中service發送數據到activity更新UI
private class Wz_Recevier extends BroadcastReceiver {
@Override
public void onReceive(Context arg0, Intent intent/*修改*/) {
// TODO Auto-generated method stub
// Intent intent = new Intent();------去掉
String actionString = intent.getAction();
if (actionString.equals("com.ljq.activity.Service")) {
Bundle bundle = intent.getExtras();
String count = bundle.getString("count");
if (count != null) {
textView.setText(count);
} else {
textView.setText("完了!");
}
}
}
}
低級錯誤
8. Android service 可以直接更新UI嗎
就算是在Activity的開啟的新線程中也是無法直接更新UI的,若這樣做會導致應用崩潰,Android限制要求在UI線程中即主線程中才能更新UI,這樣做的目的是為了防止多線程同時修改同一個控制項導致各種問題的產生,若要在其他新建的線程中更新UI需要藉助API中提供的handler。
原理大致為在主線程中實現處理特定消息的介面,然後在其他地方使用handler發送自己定義的消息,當主線程接收到消息後,你就可以根據消息的內容更新UI了。
當然也有特例,如SurfaceView就支持在新線程中修改UI。service屬於後台與Avtivity屬於不同的組件,運行在不同的線程下,它的設計不是為了處理界面的,所以不建議這么做。
下面是幾個可行的方法:
通過廣播,即在 Activity中注冊一個廣播,然後通過廣播進行service和Activity間的數據傳遞,同時以達到更新UI的目的。
通過繼承Binder類和一個回調方法實現對view的更新。當然如果不要回調方法也可以,那就直接在handleMessage()中進行數據更新也是可以。
9. Android更新UI界面的幾種方法的使用
1. 利用Android Handler機制和message消息傳遞
我們知道 , Android Handler機制主要用作線程之間的通信,為了易於理解,我們暫不考慮每個線程的Looper問題。UI更新一般是在主線程中完成的,而Handler就是定義在主線程中,然後通過在Handler構造方法中重寫HandlerMessage()方法,來處理有其他線程(子線程)傳遞過來的消息,從而達到更新UI的目的。相應的,在其他線程(子線程)中,我們通過SendMessage(message)方法來傳遞消息。
2.利用Android Handler機制和post
這個比較容易理解,也是UI更新常用的方法。 在一個新建的線程中進行更新界面的操作,然後在主線程中利用mHandler.post(Runnable runnable)來達到更新界面的目的,其中mHandler是在主線程中定義的。
3、通過runOnUiThread()方法來實現
classMyThreadextendsThread{
@Override
publicvoidrun(){
//TODOAuto-generatedmethodstub
super.run();
//數據處理
//...
runOnUiThread(newnewRunnable(){
publicvoidrun(){
//刷新界面
list.add(dog);
adapter.notifyDataSetChanged();
}
}
})
}
10. android怎麼更新UI
首先,android的UI刷新是在主線程(UI線程)中完成的。四大組件中,activity和service運行在主線程中。現在總結自己在項目中常用到的UI刷新方式。
第一,利用子線程發消息刷新UI。
子線程負責處理UI需要的數據,然後發消息到主線程來刷新UI。代碼結構如下:
new Thread(new Runnable() {
@Override
public void run() {
Person person=new Person();
person.setName(mName.getText().toString().trim());
person.setPhone(mPhone.getText().toString().trim());
Log.i("person",person.toString());
DatabaseInfoFactory.getPersonDao(mContext).addPerson(person);
Looper.prepare();
Message msg=Message.obtain();
msg.what=0x123456;
handler.sendMessage(msg);
Looper.loop();
}
}).start();
主線程中:
private Handler mHandler=new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
if(msg.what==0x123456||msg.what==0x123){
fillData();
setListener();
}
}
};
第二,利用非同步任務更新UI。代碼結構如下:
new AsyncTask<void,void,void>() {
@Override
protected void onPostExecute(Void result) {
if(mAdapter==null){
mAdapter=new LeaveInfoAdapter();
//設置數據適配器
mLVleaveInfos.setAdapter(mAdapter);
Log.i("測試", "非同步任務顯示後台獲得資料庫數據");
}
else {
mAdapter.notifyDataSetChanged();
}
super.onPostExecute(result);
}
@Override
protected Void doInBackground(Void... params) {
//獲得要顯示的數據
mleaveInfos=mLeaveInfosDao.findAll();
if (mleaveInfos==null) {
Toast.makeText(HomeActivity.this,"請假數據不存在或是已經清除!", 500).show();
}
Log.i("測試", "非同步任務後台獲得資料庫數據"+mleaveInfos.size());
return null;
}
}.execute();</void,void,void>
第三,利用配置文件+activity的生命周期方法刷新UI。