繼續貼第二部分:
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);
}
}
}
}