RFID掃描APP--source2

繼續貼第二部分:
2、MainActivity

public class MainActivity extends AppCompatActivity {


    private static final String TAG = "MainActivity";       //log TAG

    public static final int READSUCCESSMEG = 0;     // 模塊掃描成功,並啓動DetectThread檢測成功
    public static final int SENDSUCCESSMEG = 1;     // 上傳成功
    public static final int SENDFAILUREMSG = 2;     // 上傳失敗

    /*
    * 實例域
    */
    private String mURL = null;                     // 存儲URL地址,用於HttpThread

    private ListView mListView;                     // listview控件
    private FloatingActionButton mFloatButton;      // 懸浮按鈕控件

    private UhfReader mReader;                      // UHF對象,從connectactivity獲取
    private ListAdapter mListAdapter;               // listadapter
    private Handler mHandler;                       // 消息處理
    private Httpsend mHttpSender;                   // httpthread用其上傳數據

    private boolean isRun = false;                  // 標誌是否開始掃描
    private boolean isOnScreen = false;             // 標誌app是否正常運行(黑屏,home鍵退出等)

    /*
     * onCreate()
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //加入Activity池,用於settingactivity確定是銷燬此activity
        ActivityArray.getActivityArray(this).getArray().add(0, this);

        //初始化HttpSend
        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        mHttpSender = new Httpsend();
        mURL = sp.getString(SettingActivity.URL, "");

        //初始化Reader
        mReader = ConnectActivity.getReader();

        //初始化EPC池, 並初始化Adapter
        mListAdapter = new ListAdapter(this, EPCLab.getEPCLab(getApplicationContext()).getEPCList());

        //初始化聲音池
        Util.initSoundPool(this);

        //初始化View
        initiaView();

        //初始化Handler
        mHandler = new Handler(Looper.getMainLooper()) {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                // 讀取成功,啓動發送
                if(msg.what == READSUCCESSMEG) {
                    //取出要加入EPCLabs的str
                    ArrayList<String> strs = (ArrayList<String>) msg.obj;
                    //通知http要處理的EPC
                    ArrayList<EPC> epclist = new ArrayList<EPC>();
                    //加入操作,主線程更改epclab
                    for (String s : strs) {
                        epclist.add(EPCLab.getEPCLab(getApplicationContext()).addEPC(s));
                    }
                    //更新LIST視圖
                    mListAdapter.notifyDataSetChanged();
                    //開啓http線程
                    Httpthread httpthread = new Httpthread(epclist);
                    httpthread.start();
                }
                // 發送失敗
                else if(msg.what == SENDFAILUREMSG) {
                    Toast.makeText(getApplicationContext(), (String)msg.obj + " send failure", Toast.LENGTH_SHORT)
                            .show();
                }
                // 發送成功
                else if(msg.what == SENDSUCCESSMEG) {
                    ((EPC)msg.obj).setIsSend(true);         // 主線程更改epc屬性
                    mListAdapter.notifyDataSetChanged();
                }
            }
        };
    }

    /*
     *View初始化
     */
    private void initiaView() {
        //設置ActionBar
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        //設置懸浮按鈕
        mFloatButton = (FloatingActionButton) findViewById(R.id.fab);
        mFloatButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(isRun) {
                    isRun = false;
                    //顏色改變
                    mFloatButton.setImageResource(android.R.drawable.ic_dialog_dialer);
                } else {
                    //開啓新進程
                    ReadThread thread = new ReadThread();
                    thread.start();

                    isRun = true;
                    //顏色改變
                    mFloatButton.setImageResource(android.R.drawable.ic_dialog_map);
                }
            }
        });

        //正文顯示
        mListView = (ListView)findViewById(R.id.list_view);
        mListView.setAdapter(mListAdapter);
    }

    /*
     * onResume
     */
    @Override
    protected void onResume() {
        super.onResume();
        isOnScreen = true;
        if(isOnScreen && isRun) {
            //開啓新進程
            ReadThread thread = new ReadThread();
            thread.start();
        }
    }

    /*
     * onPause
     */
    @Override
    protected void onPause() {
        super.onPause();
        isOnScreen = false;
    }

    /*
     * create menu
     */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    /*
     * menu監聽
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //setting
        if (id == R.id.action_settings) {
            Intent intent = new Intent(MainActivity.this, SettingActivity.class);
            startActivity(intent);
            return true;
        }
        // clear
        else if (id == R.id.clear) {
            EPCLab.getEPCLab(this).clear();
            mListAdapter.notifyDataSetChanged();
            return true;
        }
        // upload
        else if (id == R.id.upload) {
            Httpthread httpthread = new Httpthread(EPCLab.getEPCLab(this).getEPCList());
            httpthread.start();
            return true;
        }
        // exit
        else if (id == R.id.exit) {
            finish();
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    /*
    * List Adapter
    */
    private class ListAdapter extends ArrayAdapter<EPC> {

        public ListAdapter(Context context, ArrayList<EPC> epcs) {
            super(context, 0, epcs);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if(convertView == null) {
                convertView = getLayoutInflater().inflate(R.layout.listitem_epc, null);
            }

            //設置
            EPC epc = getItem(position);

            TextView num = (TextView)convertView.findViewById(R.id.list_num);
            num.setText("" + epc.getNum());

            TextView epcStr = (TextView)convertView.findViewById(R.id.list_epc);
            epcStr.setText(epc.getEPC());

            RadioButton rb = (RadioButton)convertView.findViewById(R.id.list_issend);
            rb.setChecked(epc.isSendSuccess());

            return convertView;
        }
    }

    /*
     * read thread
     */
    class ReadThread extends Thread{
        private List<byte[]> epcList;

        @Override
        public void run() {
            super.run();
            while(isRun && isOnScreen){
                epcList = mReader.inventoryRealTime(); //實時盤存
                if(epcList != null && !epcList.isEmpty()){
                    ArrayList<String> epcstrs = new ArrayList<String>();
                    //讀取所有的epc str
                    for(byte[] epc : epcList){
                        String epcStr = Tools.Bytes2HexString(epc, epc.length);
                        epcstrs.add(epcStr);
                    }
                    // 讀到的數據送於DetectThread處理
                    DetectThread thread = new DetectThread(epcstrs);
                    thread.start();
                }
                epcList = null ;
                // 延時40ms
                try {
                    Thread.sleep(40);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /*
     * httpthread
     */
    class Httpthread extends Thread {
        private ArrayList<EPC> epcs = null;
        private SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

        /*
         * 構造函數,傳入要處理的EPC list
         */
        public Httpthread(ArrayList<EPC> list) {
            epcs = list;
        }

        @Override
        public void run() {
            super.run();
            for (EPC epc : epcs) {
                if (!epc.isSendSuccess()) {
                    String params = SettingActivity.VEHICLE_TYPE + "=" + sp.getString(SettingActivity.VEHICLE_TYPE, "")
                            + "&" + SettingActivity.VEHICLE_ID + "=" + sp.getString(SettingActivity.VEHICLE_ID, "")
                            + "&" + SettingActivity.ACTION + "=" + sp.getString(SettingActivity.ACTION, "")
                            + "&" + SettingActivity.EPC + "=" + epc.getEPC();
                    if (mHttpSender.send(mURL, params)) {
                        // 成功,更新視圖
                        Message msgsuccess = mHandler.obtainMessage();
                        msgsuccess.what = SENDSUCCESSMEG;
                        msgsuccess.obj = epc;
                        mHandler.sendMessage(msgsuccess);
                    } else {
                        // 失敗,toast
                        Message msgfailure = mHandler.obtainMessage();
                        msgfailure.what = SENDFAILUREMSG;
                        msgfailure.obj = epc.getEPC();
                        mHandler.sendMessage(msgfailure);
                    }
                }
            }
        }
    }

    /*
     * detect thread
     */
    class DetectThread extends Thread {
        // 需要檢測的epc str
        private ArrayList<String> strs;

        // 構造函數,傳入需要檢測的strings
        public DetectThread(ArrayList<String> s) {
            strs = s;
        }

        @Override
        public void run() {
            super.run();
            boolean isadd = false;          //標記有沒有新的EPC加入
            //要傳回主線程的list,讓主線程更新adapter
            ArrayList<String> addEPCstrs = new ArrayList<String>();
            //讀取所有的epc str
            for(String epcStr : strs){
                //如果epc還沒有加入EPCLabs,就加入addEPCstrs
                if(!EPCLab.getEPCLab(getApplicationContext()).isExist(epcStr)) {
                    isadd = true;
                    addEPCstrs.add(epcStr);
                }
            }
            //如果確實有新的EPC發現,則通知主線程
            if(isadd) {
                //播放提示音
                Util.play(1, 0);
                Message msg = mHandler.obtainMessage();
                msg.what = READSUCCESSMEG;
                msg.obj = addEPCstrs;
                mHandler.sendMessage(msg);
            }
        }
    }
}
發佈了19 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章