2016年1月2日 星期六

[Android]Pusher 初體驗

Pusher是啥,請點這裡 ,我來寫一個Android App,

使用了2個event ,text 以及 color,分別用來改變ImageView顏色及TextView內容。


架構說明


server(python) --->Pusher Service --->Android app

訊息內容為Json格式

{
"message": "Hello"
}

顏色內容Json格式

{
"color": "#FF00FF"
}



接下來看一下程式碼



MainActivity.java


import android.graphics.Color;
import android.os.Handler;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ImageView;
import android.widget.TextView;


import com.pusher.client.Pusher;
import com.pusher.client.channel.Channel;
import com.pusher.client.channel.SubscriptionEventListener;

import org.json.JSONException;
import org.json.JSONObject;

public class MainActivity extends ActionBarActivity {

    final String TEXTEVENT="text";
    final String ColorEvent="color";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initPusher();

    }

    private void initPusher()
    {
        final TextView message =(TextView)findViewById(R.id.message);
        final ImageView color=(ImageView)findViewById(R.id.color);
        final Handler mHandler=new Handler();
        


        Pusher pusher = new Pusher("my key");

        Channel channel = pusher.subscribe("test_channel");

        channel.bind(TEXTEVENT, new SubscriptionEventListener() {
            @Override
            public void onEvent(String channelName, final String eventName, final String data) {
                Log.d(TEXTEVENT , data);
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        try
                        {
                            JSONObject jobj = new JSONObject(data);
                            Log.d(TEXTEVENT , jobj.optString("message"));
                            message.setText(jobj.optString("message"));
                        }
                        catch(JSONException jsonEx)
                        {

                        }



                    }
                });
            }
        });

        channel.bind(ColorEvent, new SubscriptionEventListener() {
            @Override
            public void onEvent(String channelName, final String eventName, final String data) {

                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        try
                        {
                            JSONObject jobj = new JSONObject(data);
                            color.setBackgroundColor(Color.parseColor(jobj.getString("color")));
                        }
                        catch(JSONException jsonEx)
                        {

                        }
                    }
                });
            }
        });

        pusher.connect();

    }
}



activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:id="@+id/message"

       />

    <ImageView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:id="@+id/color"
        />

</LinearLayout>


記得在Androidmanifest.xml中加入上網的權限(Pusher範例code沒有提醒這個)

<uses-permission android:name="android.permission.INTERNET" />


接下來是增加幾行東西到build.gradle(module: app)裡面

repositories { maven { url 'http://clojars.org/repo' } } dependencies { compile 'com.pusher:pusher-java-client:1.0.0' }



最後是Server端的Python 程式碼

import pusher

  p = pusher.Pusher(
  app_id='my id',
  key='my key',
  secret='my sec',
  ssl=True,
  port=443
)
p.trigger('test_channel', 'text', {'message': 'hello Android'})
p.trigger('test_channel', 'color', {'color': '#ff0000'})


執行結果












































接下來我們用一個影片來試看看,Pusher送達的速度,平板走家裡的WiFi,

手機走的是行動網路。






最後還是要提醒大家一件事,Pusher沒有保證送達喔,如果你的裝置並沒有

與Pusher服務連接,你送出去的訊息,是會石沉大海的,所以建議還是做一

個驗證機置啦,push這種東西,常見的用途就是一個事件的觸發,例如喚醒

某個功能,之後就由那個功能接手動作,以及向server回報收到訊息。

沒有留言:

張貼留言