AndroidService 深度分析(2)

AndroidService 深度分析(2)

上一篇文章我們Service的生命周期進行了測試及總結。

這篇文章我們介紹下綁定執行的Service的實現。

綁定執行的Service可能是僅為本應用提供服務,稱為本地Service。也可能為其它應用提供跨進程服務,即遠程Service。以下分別進行介紹:

本地Service

假設Service僅僅服務于本應用。那么我們僅僅須要繼承Binder類,定義我們須要實現的方法就可以,當發起綁定連接時,Service將會在onBind方法中返回這個繼承類的對象。使得client與Service共享一個Binder對象。Binder就像一座橋梁,使client與Service可以互相聯系。以下貼出本地Service的實現演示樣例:

LocalService代碼:

public classLocalService extends Service {private String TAG =getClass().getSimpleName();MyBinder myBinder = new MyBinder();ServiceListener myServiceListener;public LocalService() {}public interface ServiceListener {public String getActivityInfo();}private void setListener(ServiceListenermyServiceListener) {this.myServiceListener = myServiceListener;}//綁定成功后。Service就能夠通過這種方法獲得Activity的信息private void getActivityInfo() {String activityInfo =myServiceListener.getActivityInfo();Log.d(TAG, TAG +"+activityInfo------>" + activityInfo);}private String getInfo() {return "Hello,我是LocalService的方法,你能夠通過它的對象訪問我。";}public class MyBinder extends Binder {public String getServiceInfo() {return getInfo();}public void setServiceListener(ServiceListenermyServiceListener) {setListener(myServiceListener);}}@Overridepublic IBinder onBind(Intent intent) {Log.d(TAG, TAG +"------>onBind()");return myBinder;}@Overridepublic void onRebind(Intent intent) {Log.d(TAG, TAG +"------>onRebind()");super.onRebind(intent);}@Overridepublic boolean onUnbind(Intent intent) {Log.d(TAG, TAG +"------>onUnbind()");//return false;這里的返回值決定下一次綁定時是否運行onRebindreturn true;}
}

LocalActivity代碼:

public classLocalActivity extends ActionBarActivity {private String TAG =getClass().getSimpleName();Intent serviceIntent;@Overrideprotected void onCreate(BundlesavedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_local);Log.d(TAG, TAG +"------>onCreate()");serviceIntent = new Intent(this,LocalService.class);}public void bindService(View v) {Log.d(TAG, TAG +"------>bindService()");bindService(serviceIntent,serviceConnection, Service.BIND_AUTO_CREATE);}public void unBindService(View v) {Log.d(TAG, TAG +"------>unBindService()");unbindService(serviceConnection);}@Overrideprotected void onDestroy() {Log.d(TAG, TAG +"------>onDestroy()");super.onDestroy();}ServiceConnection serviceConnection = newServiceConnection() {@Overridepublic voidonServiceConnected(ComponentName name, IBinder service) {Log.d(TAG, TAG +"------>onServiceConnected()");LocalService.MyBinder binder =(LocalService.MyBinder) service;String localServiceInfo =binder.getServiceInfo();Log.d(TAG, TAG +"+onServiceConnected------>" + localServiceInfo);binder.setServiceListener(newLocalService.ServiceListener() {@Overridepublic String getActivityInfo(){return "Hello,我在LocalActivity中。LocalService能夠調用我獲得LocalActivity的消息!";}});}@Overridepublic voidonServiceDisconnected(ComponentName name) {Log.d(TAG, TAG +"------>onServiceDisconnected()");}};
}

Activity相應的布局就是兩個button。分別實現綁定和解綁功能,如圖:

Activity與Service都是須要在Manifest文件里注冊的哦。

?

我們啟動Activity。先后綁定Service,輸出日志例如以下:

03-17 10:10:58.525  D/LocalActivity﹕LocalActivity------>onCreate()
03-17 10:11:00.955  D/LocalActivity﹕LocalActivity------>bindService()
03-17 10:11:00.975  D/LocalService﹕LocalService------>onBind()
03-17 10:11:00.995  D/LocalActivity﹕LocalActivity------>onServiceConnected()
03-17 10:11:00.995  D/LocalActivity﹕ LocalActivity+onServiceConnected------>Hello,我是LocalService的方法。你能夠通過它的對象訪問我。
03-17 10:11:16.345  D/LocalActivity﹕LocalActivity------>unBindService()
03-17 10:11:16.345  D/LocalService﹕LocalService------>onUnbind()

? ? ? ?上面的日志顯示,我們的確實現了Service的綁定與解綁工作,不僅如此,細心的你應該還發現了我們實現了Service與Activity中相互的調用吧。是的。在實際工作中我們不僅須要指示Service為我們提供服務。Service有時也須要獲取到client的數據來更好地提供服務(LocalService中的getActivityInfo方法? 通過回調實現)。

這里我總結下詳細的實現過程:

1、在Service類中,設計繼承Binder類的內部類MyBinder,加入須要向Activity提供的方法。本例中的getServiceInfo方法實現了獲取Service信息的功能,當然有時候為了簡便。我們直接提供方法返回Service對象。可是一般并不建議這樣做;同一時候注意到setServiceListener方法。它是實現Service調用Activity提供方法的重要環節。我們通過回調的方法實現了Service對Activity的訪問。

2、重寫onBind方法,并返回MyBinder對象。至此。Service類的設計就完畢了;

3、在Activity中。重寫ServiceConnection接口的onServiceConnected與onServiceDisConnected方法。在onServiceConnected方法中。我們獲得了onBinder方法返回的MyBinder對象。然后調用setServiceListener方法設置Service訪問Activity所須要的回掉接口對象;
4、至此,Service與Activity之間的 “橋梁”搭建完成。Service中我們能夠通過getActivityInfo方法獲得Activity的信息;而在Activity中,我們也能夠通過getServiceInfo方法獲得Service的信息。

遠程Service

當我們的Service須要為其它應用提供服務的時候,我們就要用到遠程Service了。遠程Service有兩種實現方式,各自是Messenger方式與AIDL(Andriod進程間接口描寫敘述語言)方式。以下分別進行介紹。

Messenger方式

在這樣的方式中。我們定義一個Handler來處理不同的Message對象。

這個Handler是Messenger實現與client共享IBinder的基礎,它同意client通過Message對象向Service發送命令。

另外,client也能夠定義一個Messenger。這樣,Service也能夠把消息發送給client。? 這是實現進程間通信的最簡單的方式,由于Messenger隊列將會在單線程中運行。我們不須要去考慮線程安全。

使用Messenger實現進程間通信的步驟:

l? 實現一個Handler,它用來處理傳遞的Message對象;

l? 創建一個Messenger對象,將Handler對象作為構造參數。

l? 使用Messenger對象創建一個IBinder對象,并通過onBind返回;

l? client將接收到的IBinder對象作為Messenger的構造參數。實例化一個Messenger對象。這個Messenger對象將擁有Handler的引用;

l? 在client通過Handler發送Message對象。Service中就能夠通過Handler的handleMessage處理這個Message。

以下提供一個演示樣例:

我們在ServiceTestproject下新建MessengerService類:

public class MessengerService extendsService {/*** Command to the service to display a message*/static final int MSG_SAY_HELLO = 1;static final int MSG_GET_CLIENT_MESSENGER = 2;static final int MSG_FROM_SERVICE = 3;private String TAG = getClass().getSimpleName();Messenger messengerToClient;/*** Handler of incoming messages from clients.*/class ServiceIncomingHandler extends Handler {@Overridepublic void handleMessage(Message msg) {Log.d(TAG, TAG + "------>handleMessage()");switch (msg.what) {case MSG_SAY_HELLO:Log.d(TAG,"handleMessage------>MSG_SAY_HELLO!");Toast.makeText(getApplicationContext(), "hello!",Toast.LENGTH_SHORT).show();break;case MSG_GET_CLIENT_MESSENGER:Log.d(TAG,"handleMessage------>Service收到Activity的messenger對象!");//此處獲得可向client發送消息的Messenger對象messengerToClient =msg.replyTo;Message serviceMsg =Message.obtain(null, MSG_FROM_SERVICE, 0, 0);try {//向client發送消息messengerToClient.send(serviceMsg);} catch (RemoteException e){e.printStackTrace();}break;default:super.handleMessage(msg);}}}/*** 將這個serviceMessenger發送給client。client就能夠通過它聯系Service了*/final Messenger serviceMessenger = new Messenger(newServiceIncomingHandler());/*** When binding to the service, we return an interface to our messenger* for sending messages to the service.*/@Overridepublic IBinder onBind(Intent intent) {Log.d(TAG, TAG + "------>onBind()");Toast.makeText(getApplicationContext(), "binding",Toast.LENGTH_SHORT).show();return serviceMessenger.getBinder();}
}


新建MessengerTestproject,并創建ActivityMessenger類:

public classActivityMessenger extends Activity {/*** Messenger for communicating with theservice.*/Messenger messengerToService = null;/*** Flag indicating whether we have calledbind on the service.*/boolean mBound;private String TAG =getClass().getSimpleName();/*** Command to the service to display amessage*/static final int MSG_SAY_HELLO = 1;static final intMSG_SEND_MESSENGER_TO_SERVICE = 2;static final int MSG_FROM_SERVICE = 3;/*** Class for interacting with the maininterface of the service.*/private ServiceConnection mConnection = newServiceConnection() {public voidonServiceConnected(ComponentName className, IBinder service) {// This is called when theconnection with the service has been// established, giving us theobject we can use to// interact with the service.  We are communicating with the// service using a Messenger, sohere we get a client-side// representation of that from theraw IBinder object.Log.d(TAG, TAG +"------>onServiceConnected()");messengerToService = newMessenger(service);mBound = true;Message msg = Message.obtain(null,MSG_SEND_MESSENGER_TO_SERVICE, 0, 0);msg.replyTo = activityMessenger;try {//Messenger對象發送消息。這個msg對象將交給Service類中的handleMessage處理messengerToService.send(msg);} catch (RemoteException e) {e.printStackTrace();}}public voidonServiceDisconnected(ComponentName className) {// This is called when theconnection with the service has been// unexpectedly disconnected --that is, its process crashed.Log.d(TAG, TAG +"------>onServiceDisconnected()");messengerToService = null;mBound = false;}};/*** Handler of incoming messages fromservice.*/class IncomingHandler extends Handler {@Overridepublic void handleMessage(Message msg){Log.d(TAG, TAG + "------>handleMessage()");switch (msg.what) {case MSG_FROM_SERVICE:Log.d(TAG, TAG +"+MSG_FROM_SERVICE------>Activity收到Service回復的消息!");Toast.makeText(getApplicationContext(), "MSG_FROM_SERVICE!",Toast.LENGTH_SHORT).show();break;default:super.handleMessage(msg);}}}/*** Target we publish for service to sendmessages to IncomingHandler.*/final Messenger activityMessenger = newMessenger(new IncomingHandler());public void sayHello(View v) {Log.d(TAG, TAG +"------>sayHello()");if (!mBound) return;// Create and send a message to theservice, using a supported 'what' valueMessage msg = Message.obtain(null,MSG_SAY_HELLO, 0, 0);try {//Messenger對象發送消息,這個msg對象將交給Service類中的handleMessage處理messengerToService.send(msg);} catch (RemoteException e) {e.printStackTrace();}}@Overrideprotected void onCreate(BundlesavedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.d(TAG, TAG +"------>onCreate()");}@Overrideprotected void onStart() {Log.d(TAG, TAG +"------>onStart()");super.onStart();// Bind to the servicebindService(newIntent("com.example.servicestudy.remoteservie.MessengerService"),mConnection,Context.BIND_AUTO_CREATE);}@Overrideprotected void onStop() {Log.d(TAG, TAG +"------>onStop()");super.onStop();// Unbind from the serviceif (mBound) {unbindService(mConnection);mBound = false;}}
}

Acitivty與Service都須要在Manifest文件里注冊。Service須要設置android:exported屬性為true,并設置intent-filter。

例如以下所看到的:

<service    android:name=".remoteservie.MessengerService"android:enabled="true"android:exported="true"><intent-filter><actionandroid:name="com.example.servicestudy.remoteservie.MessengerService"/></intent-filter></service>

好了,編碼工作我們已經完畢了,以下我們進行一下測試。打印日志例如以下:

03-1713:11:46.195  D/ActivityMessenger﹕ActivityMessenger------>onCreate()
03-1713:11:46.195  D/ActivityMessenger﹕ActivityMessenger------>onStart()
03-1713:11:46.215  D/MessengerService﹕MessengerService------>onBind()
03-17 13:11:46.235  D/ActivityMessenger﹕ActivityMessenger------>onServiceConnected()
03-1713:11:46.275  D/MessengerService﹕MessengerService------>handleMessage()
03-17 13:11:46.275 D/MessengerService﹕ handleMessage------>Service收到Activity的messenger對象!
03-17 13:11:46.285  D/ActivityMessenger﹕ActivityMessenger------>handleMessage()
03-17 13:11:46.285 D/ActivityMessenger﹕ ActivityMessenger+MSG_FROM_SERVICE------>Activity收到Service回復的消息!
03-1713:11:55.425  D/ActivityMessenger﹕ ActivityMessenger------>sayHello()
03-1713:11:55.425  D/MessengerService﹕MessengerService------>handleMessage()
03-1713:11:55.425  D/MessengerService﹕handleMessage------>MSG_SAY_HELLO!
03-1713:12:00.665  D/ActivityMessenger﹕ActivityMessenger------>onStop()

看見了嗎?完美實現了Activity與Service互相發送消息。它們都是基于Messenger對象,Activity從Ibinder處獲得一個可向Service發送消息的Messenger對象,接著Activity給Service發送了一個消息,并將可向Activity發送消息的Messenger對象攜帶過去。這樣就實現了他們之間的交互。

邏輯上和便立即都非常easy易懂吧。點個贊。

好了,既然Messenger這么簡單易用,為什么我們還須要繼續看AIDL方式呢?不知道你有沒有想過。Messenger方式在處理client發送的消息時,是將全部消息排成一個隊列,然后依次處理。也就是單線程處理方式,這樣的處理方式的長處是簡便不easy引起其它問題,比方線程安全。可是。對于一些即時性要求比較高的服務,這樣的方式可能就不夠用了,或許我們須要採用多線程的方式,將接收到的請求盡快處理。這時候就能夠直接使用AIDL方式了。

AIDL方式

事實上我悄悄告訴你,Messenger方式的底層實現也是基于AIDL方式實現的,系統為了方便跨進程的服務。為我們提供了一個Messenger類來便利的實現,可是它可能無法滿足我們的需求,這時候我們就須要直接基于AIDL方式實現了。

事實上AIDL的實現不難,僅僅是有非常多細節須要注意。我這里也只是多描寫敘述推薦一篇文章。有代碼和總結:http://blog.csdn.net/songjinshi/article/details/22918405

我把總結摘抄過來:

AIDL的創建方法:?
AIDL語法非常easy,能夠用來聲明一個帶一個或多個方法的接口,也能夠傳遞參數和返回值。因為遠程調用的須要, 這些參數和返回值并非不論什么類型.以下是些AIDL支持的數據類型:?
1. 不須要import聲明的簡單Java編程語言類型(int,boolean)?
2.String, CharSequence不須要特殊聲明?
3.List, MapParcelables類型, 這些類型內所包括的數據成員也僅僅能是簡單數據類型, String等其它比支持的類型.?(?(另外: 我沒嘗試Parcelables, Eclipse+ADT下編譯只是, 也許以后會有所支持).?
以下是AIDL語法:?
// 文件名稱: SomeClass.aidl // 文件能夠有凝視, java的一樣 // package曾經的凝視, 將會被忽略. // 函數和變量曾經的凝視, 都會被增加到生產java代碼中. package com.cmcc.demo;?
//import 引入語句 import com.cmcc.demo.ITaskCallback;?
interfaceITaskBinder {?
//函數跟java一樣, 能夠有0到多個參數 ,能夠有一個返回值 boolean isTaskRunning();?
voidstopRunningTask(); //參數能夠是另外的一個aidl定義的接口 void registerCallback(ITaskCallback cb);?
voidunregisterCallback(ITaskCallback cb);?
//參數能夠是String, 能夠用in表入輸入類型, out表示輸出類型.?
intgetCustomerList(in String branch, out String customerList);?
}?

實現接口時有幾個原則:?
.拋出的異常不要返回給調用者. 跨進程拋異常處理是不可取的.?
.IPC調用是同步的

假設你知道一個IPC服務須要超過幾毫秒的時間才干完畢地話,你應該避免在Activity的主線程中調用。也就是IPC調用會掛起應用程序導致界面失去響應. 這樣的情況應該考慮單起一個線程來處理.?
.不能在AIDL接口中聲明靜態屬性。

?
IPC的調用步驟:?
1. 聲明一個接口類型的變量,該接口類型在.aidl文件里定義。?
2. 實現ServiceConnection?
3. 調用ApplicationContext.bindService(),并在ServiceConnection實現中進行傳遞.?
4. ServiceConnection.onServiceConnected()實現中,你會接收一個IBinder實例(被調用的Service). 調用YourInterfaceName.Stub.asInterface((IBinder)service)將參數轉換為YourInterface類型。?
5. 調用接口中定義的方法。

你總要檢測到DeadObjectException異常。該異常在連接斷開時被拋出。它僅僅會被遠程方法拋出。?
6. 斷開連接。調用接口實例中的ApplicationContext.unbindService()?

?

同一時候。我自己對AIDL實現也做了充分的測試,實現了Activity與Service之間互相調用方法,有興趣的朋友能夠下下來測試一下。

Github地址:https://github.com/BBigBoy/AndroidServiceFULLStudy

?

?

至此,關于Service的所有學習均已完畢。我們進行了Android Service的完整測試學習,主要包含生命周期測試,本地綁定執行Service實現、遠程綁定執行Service的Messenger方式與AIDL方式實現 。 ?所有BOUND SERVICE的演示樣例均實現了Service與client的交互功能。即Service能夠調用client的方法,client也能夠調用Service的方法。完整的項目見Github倉庫:

https://github.com/BBigBoy/AndroidServiceFULLStudy

版權聲明:本文博主原創文章,博客,未經同意不得轉載。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287510.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287510.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287510.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Hello Playwright:(3)基本概念

下面介紹一下 Playwright 中的基本概念&#xff1a;Headless 瀏覽器Playwright 需要特定版本的瀏覽器二進制文件才能運行。這些瀏覽器都支持 2 種 運行模式&#xff1a;Headless&#xff0c;無瀏覽器 UI&#xff0c;運行速度較快&#xff0c;常用于自動化運行Headed&#xff0c…

[python opencv 計算機視覺零基礎到實戰] 十二 直方圖

一、學習目標 了解matplotlib繪圖庫的使用了解如何通過折線圖或者直方圖對圖表進行繪制了解了通過圖標對圖片內容進行直觀判斷 如有錯誤歡迎指出~ 二、了解圖像直方圖及其應用 2.1 了解matplotlib庫 在了解圖像直方圖前我們需要了解一個matplotlib庫&#xff0c;matplotli…

建造者模式之項目運用

1 問題 建造者模式&#xff0c;我們也許不陌生&#xff0c;因為我們看到很多開源框架或者Android源碼里面用到&#xff0c;類似這樣的代碼結構 A a new A.builder().method1("111").method2("222").build(); 很明顯&#xff0c;一般這里的結構有builde…

專題三--1005

題目 A group of researchers are designing an experiment to test the IQ of a monkey. They will hang a banana at the roof of a building, and at the mean time, provide the monkey with some blocks. If the monkey is clever enough, it shall be able to reach the …

shell中的數字

shell中的數字 author :headsen chen date :2017-10-18 15:01:42 個人原創&#xff0c;轉載請注明作者&#xff0c;出處&#xff0c;否則依法追究法律責任 1,生成隨機數&#xff08;范圍&#xff1a;0-32767&#xff09;&#xff0c;用特殊變量&#xff1a;RANDOM 2&#xff…

serviceloader java_【java編程】ServiceLoader使用看這一篇就夠了

轉載:https://www.jianshu.com/p/7601ba434ff4想必大家多多少少聽過spi&#xff0c;具體的解釋我就不多說了。但是它具體是怎么實現的呢&#xff1f;它的原理是什么呢&#xff1f;下面我就圍繞這兩個問題來解釋&#xff1a;實現: 其實具體的實現類就是java.util.ServiceLoader…

.NET7 Preview4 之OpenAPI swagger改進

在MiniAPI系列中&#xff0c;《.NET6之MiniAPI(十八)&#xff1a;OpenAPI swagger》介紹了swagger在MiniAPI框架中的使用&#xff0c;當時留下很多不足&#xff0c;隨著.NET7 Preview4的推出&#xff0c;這方面得到了很大的改進&#xff0c;我還是使用“十八”這篇文章的案例。…

Swift - 自定義單元格實現微信聊天界面

1&#xff0c;下面是一個放微信聊天界面的消息展示列表&#xff0c;實現的功能有&#xff1a; &#xff08;1&#xff09;消息可以是文本消息也可以是圖片消息&#xff08;2&#xff09;消息背景為氣泡狀圖片&#xff0c;同時消息氣泡可根據內容自適應大小&#xff08;3&#x…

[python opencv 計算機視覺零基礎到實戰] 十三 直方圖顏色提鮮

一、學習目標 了解了均衡化的作用是什么了解灰度、YUV、彩色圖片均衡化的方法是使用什么方法了解了合并通道的方法是什么了解了分離通道的方法是什么 如有錯誤歡迎指出~ 二、了解圖像均衡化 2.1 了解直方圖均衡化 圖像直方圖均衡化主要是對圖像中的少數灰度進行壓縮&#…

java 中字符串比較方法_java中常用的字符串的比較方法(兩種)

比較字符串比較常用的兩個方法是運算符“”和String的equals方法。使用“”比較兩個字符串&#xff0c;是比較兩個對象的的“地址”是否一致&#xff0c;本質就是判斷兩個變量是否指向同一個對象&#xff0c;如果是則返回true&#xff0c;否則返回的是false。而String類的equal…

Android之稍微靠譜點的透明Activity(不獲取觸摸事件)

1 問題 實現透明的Activity(不獲取觸摸事件),就行什么也看不到,打開了透明activity,也不影響其他頁面的滑動和點擊,就行什么事情都沒發生一樣。 2 代碼實現 1)配置樣式 <style name="TestTheme" parent="Theme.AppCompat.Light"><item na…

分布式服務框架dubbo原理解析 轉

alibaba有好幾個分布式框架&#xff0c;主要有&#xff1a;進行遠程調用(類似于RMI的這種遠程調用)的(dubbo、hsf)&#xff0c;jms消息服務(napoli、notify)&#xff0c;KV數據庫(tair)等。這個框架/工具/產品在實現的時候&#xff0c;都考慮到了容災&#xff0c;擴展&#xff…

【傾情奉獻】遙感物候研究:30年長時間序列遙感數據集GIMMS 3g NDVI產品預處理完整步驟

本文為作者碩士學位論文遙感物候研究數據處理過程總結。GIMMS(Global Inventory Modelling and Mapping Studies) 3g NDVI來源于ECOCAST網站(http://ecocast.arc.nasa.gov),是由NOAA衛星搭載的AVHRR傳感器獲取的全球植被數據,空間分辨率為0.0833?,時間分辨率為15?d,一…

過早的給方法中 引用對象 設為 null 可被 GC提前回收嗎?

經常在代碼中看到有人將 null 賦值給引用類型&#xff0c;來達到讓 GC 提前回收的目的&#xff0c;這樣做真的有用嗎&#xff1f;今天我們就來研究一下。為了方便講解&#xff0c;來一段測試代碼&#xff0c;提前將 test1null &#xff0c;然后調用 GC.Collect() 看看是否能提前…

[python opencv 計算機視覺零基礎到實戰] 十五 直方圖反向投影

一、學習目標 了解了直方圖反向投影的一般流程了解2D直方圖的使用 如有錯誤歡迎指出~ 二、了解直方圖反向投影 2.1 了解2D直方圖 需要對直方圖進行反向投影&#xff0c;需要使用2D直方圖。2D直方圖需要使用calcHist方法。calcHist方法在前兩節中已經有了解&#xff0c;現在…

關聯規則java代碼_重量挖掘關聯規則挖掘方法,哪個大神可以將以下偽代碼轉換為Java代碼?...

重量挖掘關聯規則挖掘方法&#xff0c;哪個大神可以將以下偽代碼轉換為Java代碼&#xff1f; 10改進的加權關聯規則算法的基本步驟與Apriori算法相似: 首先找到加權支持度不小于用戶指定的最小加權支持度的所有頻繁項集加權關聯規則&#xff0c;然后使用頻繁項集生成所有滿足最…

Boostrap ZURB Foundation —— Web開發前端框架

webflow&#xff1a;Webflow 允許設計師通過自由的拖拉拽與 CSS 類互動&#xff0c;而定義它們的過程無需寫任何一行代碼。用戶在完成從設計到 CSS 構架之后&#xff0c;甚至可以在線直接將建好的網頁發布&#xff0c;而不需要導出代碼到其他發布工具上。類似的這些 B2D 市場&a…

Git之HEAD和origin

1 問題 我們經常看見git相關操作里面看到HEAD和origin這些專業名稱&#xff0c;它娘的到底什么意思。 2 解釋 1&#xff09;HEAD git 中的分支&#xff0c;本質上僅僅是個指向 commit 對象的可變指針&#xff0c; HEAD 是一個特別指針&#xff0c;它是一個指向你正在工作中的…

如何離線安裝chrome插件

如何離線安裝chrome插件 本文轉自Work Hard Work Smart博客園博客&#xff0c;原文鏈接&#xff1a;http://www.cnblogs.com/linlf03/p/6838852.html&#xff0c;如需轉載請自行聯系原作者