⑴ android 怎樣發送廣播更新ui
更新ui 可以直接在主線程里操作。一般用不到廣播。如果非要用廣播,一般都是服務更新線程才這么做。在服務里注冊/發送廣播。然後在ui線程里接受廣播,執行更新操作。
⑵ Android更新Ui的幾種方法和見解
利用Looper更新UI界面
2.AsyncTask利用線程任務非同步更新UI界面
3.利用Runnable更新UI界面
⑶ 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("完了!");
}
}
}
}
低級錯誤
⑷ 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()方法來實現
java">classMyThreadextendsThread{
@Override
publicvoidrun(){
//TODOAuto-generatedmethodstub
super.run();
//數據處理
//...
runOnUiThread(newnewRunnable(){
publicvoidrun(){
//刷新界面
list.add(dog);
adapter.notifyDataSetChanged();
}
}
})
}
⑸ 關於android 動態更新ui 問題
我謝了一個 你看看是不是你要的 ,就是每隔三秒進行更新一次
package com.org.phone;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.telephony.PhoneStateListener;
import android.telephony.SignalStrength;
import android.telephony.TelephonyManager;
import android.widget.TextView;
public class PhoneStateListenerActivity extends Activity {
TextView tvSignal;
TelephonyManager tm;
SignalStrength strenth;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tvSignal = (TextView) findViewById(R.id.tvSignal);
tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
tm.listen(new MyPhoneStateListner(),
PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
task();
}
public void task() {
Timer timer = new Timer();
// 每隔3秒進行更新
timer.schele(new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
update();
}
}, 0, 3000);
}
Handler hand = new Handler() {
};
public void update() {
hand.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
tvSignal.setText(strenth.getGsmSignalStrength() + "");
}
});
}
class MyPhoneStateListner extends PhoneStateListener {
@Override
public void onSignalStrengthsChanged(SignalStrength signalStrength) {
// TODO Auto-generated method stub
super.onSignalStrengthsChanged(signalStrength);
strenth = signalStrength;
}
}
}
⑹ 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。
⑺ Android service 可以直接更新UI嗎
就算是在Activity的開啟的新線程中也是無法直接更新UI的,若這樣做會導致應用崩潰,Android限制要求在UI線程中即主線程中才能更新UI,這樣做的目的是為了防止多線程同時修改同一個控制項導致各種問題的產生,若要在其他新建的線程中更新UI需要藉助API中提供的handler。
原理大致為在主線程中實現處理特定消息的介面,然後在其他地方使用handler發送自己定義的消息,當主線程接收到消息後,你就可以根據消息的內容更新UI了。
當然也有特例,如SurfaceView就支持在新線程中修改UI。service屬於後台與Avtivity屬於不同的組件,運行在不同的線程下,它的設計不是為了處理界面的,所以不建議這么做。
下面是幾個可行的方法:
通過廣播,即在 Activity中注冊一個廣播,然後通過廣播進行service和Activity間的數據傳遞,同時以達到更新UI的目的。
通過繼承Binder類和一個回調方法實現對view的更新。當然如果不要回調方法也可以,那就直接在handleMessage()中進行數據更新也是可以。
⑻ 如何在android一條單獨線程,更新ui
方法有兩種:
通過繼承Thread類,重寫Run方法來實現
通過繼承介面Runnable實現多線程
主要接受子線程發送的數據, 並用此數據配合主線程更新UI.
Handler的主要作用:主要用於非同步消息的處理
Handler的運行過程:
當(子線程)發出一個消息之後,首先進入一個(主線程的)消息隊列,發送消息的函數即刻返回,而在主線程中的Handler逐個的在消息隊列中將消息取出,然後對消息進行處理。這樣就實現了跨線程的UI更新(實際上還是在主線程中完成的)。
這種機制通常用來處理相對耗時比較長的操作,如訪問網路比較耗時的操作,讀取文大文件,比較耗時的操作處理等。
在大白話一點的介紹它的運行過程:
啟動應用時Android開啟一個主線程
(也就是UI線程) , 如果此時需要一個耗時的操作,例如:
聯網讀取數據,或者讀取本地較大的一個文件的時候,你不能把這些操作放在主線程中,如果你放在主線程中的話,界面會出現假死現象(這也就是你在主線程中直接訪問網路時會提示你異常的原因,如我們上篇文章所述Android主線程不能訪問網路異常解決辦法)。
⑼ android中如何實現UI的實時更新
1、在主線程中啟動一個子線程
首先,我們需要在主線程中啟動一個子線程,這個比較簡單,直接在MainActivity的onCreate()方法中調用如下方法即可:
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();
}
}
⑽ Android service 可以直接更新UI嗎
不可以直接更新UI,但是可以通過幾種方式來更新:
1 廣播。
2 使用binder機制加回調。
3 使用某些系統自帶的回調機制,比如資料庫監聽的回調等等。