关注分享主机优惠活动
国内外VPS云服务器

基于nlecloud(新世界)的智能排队机的实现-Android端

摘要:启用禁用图表上所有可能的触摸操作。 禁用右轴绘图。 如果轴数据设置为 ,则绘制网格线。 如果每次数据动态更改时未能调用此方法,可能会导致崩溃或意外行为。

智能队列机导入关闭和授权声明导入关闭声明授权网络安全问题描述解决方案ActivityWelComeActvity渲染描述代码LoginActivity渲染描述代码MainActivity渲染描述代码HistoricalDataActivity渲染描述代码后台数据概述

导入闭包和权限声明 导入闭包

包含 1. New World Closure:连接New World云平台,通过底层硬件设备检索数据,并用于上传到手机。 终端通过该闭包连接云平台,实时检索数据 2. Google提供的Material Design API 3. MPAndroidChar:绘制折线图等

实现项目(路径:“:nlecloud -sdk” ) 实现“com.google.android.material:material:1.1.0-alpha09” 实现“com.getbase:floatingactionbutton:1.10.1” 实现“com.google.android.material:material: 1.0.0” 实现“ com.github.PhilJay:MPAndroidChart:v3.1.0》权限声明

由于需要检索云平台数据,所以声明了所有网络权限

网络安全问题解释

Google使用用户数据来确保安全,下一代Android系统的设备(Android P) 默认情况下必须使用加密连接,因此运行 Android P 系统的 Android 设备将不再能够使用加密连接来发送或接收流量。 生成(传输层安全) 传输层安全协议不受影响。

解决方案在Android Studio中创建一个XML包,进入res目录,在xml包内创建一个network_security_config.xml文件(自定义文件名)res->xml->network_security_config.xml代码。如下:

manifest文件中下一步:

android:networkSecurityConfig="@xml/network_security_config" Activity WelComeActvity渲染说明

右上角按钮编号从5倒数表示handler的异步通信。实现使用0自动跳转到登录界面。 ; if (msg.what == 0 && 标志) {int count = CountDown(); btn_Skip.setText( "skip" + count ); handler.sendEmptyMessageDelayed( 0,1000 ); 代码中的 Code

标志用于处理程序。 倒计时尚未结束。 点击按钮即可跳跃。 由于传输、异步通信尚未完成,因此无法重新渲染。

** * 作者:FranzLiszt * 完成时间:9-20*/public class WelComeActivity extends AppCompatActivity { private button btn_Skip,GetInto; private int TotalNumber = 5; / * [跳过] 或 [进入应用程序] 使用用于单击按钮。 界面跳转,但是线程并没有停止。 即使到了时间也会重新渲染一次。 该标志不能用于控制信息的异步​​部署。 效果*/ private boolean Flag = true; Handler handler = new Handler( ){ @Override public void handleMessage(@NonNull Message msg) { super.handleMessage( msg ); if (msg.what == 0 && Flag) { int Count = CountDown(); btn_Skip.setText( "跳过" + Cohandler.sendEmptyMessageDelayed( 0,1000 ); @Override protected void onCreate(Bundle SavedInstanceState) { super.onCreate(savedInstanceState ); if (Build.VERSION.SDK_INT >= 21) { View DecorView = getWindow( ).getDecorView (); DecorView.setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE ); getWindow().setStatusBarColor( Color.TRANSPARENT ); setContentView( R.layout.activity_wel_come ); } /* 5秒后自动跳转 */私有无效 InitView(){ btn_Skip = findViewById( R.id.btn_Skip ); GetInto = findViewById( R.id.GetInto); handler.sendEmptyMessageDelayed( 0,1000 );if (TotalNumber -- == 1){ReturnActivity(LoginActivity.class); 返回TotalNumber。 } public void Skip(View view) { flag = false ReturnActivity(LoginActivity.class); public void GetIntoApp(View view) { flag = false; private void ReturnActivity(Class Activity); Intent( WelComeActivity.this,Activity ) ); }} LoginActivity渲染说明

MD组件库的Google MD组件库采用的UI部分此处省略。 代码部分主要检索用户输入的账号和密码并发送给云平台进行验证。 如果密码正确,服务器返回AccessToken JSON数据并反序列化。 ,使用该token进行后续操作。

代码

拿到AccessToken后,通过SharedPreferences封装类SP保存(锁定SP封装类在另一篇博文中有详细介绍,这里不再赘述。

>

https://editor.csdn.net/md/?articleId=120434977

public class LoginActivity extends AppCompatActivity { pPrivate EditText mUserName,mPassWord; Private String AccessToken = ""; Private SPsp; 私有上下文 context = null; @Override protected void onCreate(Bundle SavedInstanceState) { super.onCreate(savedInstanceState ); if (Build.VERSION.SDK_INT >= 21) { View DecorView = getWindow().getDecorView(); View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE ); getWindow().setStatusBarColor( Color.TRANSPARENT ); setContentView( R.layout.activity_login ) ; InitView(){ mUserName = findViewById( R.id.username ); mPassWord = findViewById( R.id.password ); if (context == null){context = LoginActivity.this; } } private void LoginMethod(){ String UserName = mUserName.getText().toString().trim(); String PassWord = mPassWord.getText().toString().trim(); TextUtils.isEmpty( UserName )){ Toast.makeText( context,"用户名不能为空",Toast.LENGTH_SHORT ).show(); return; if (TextUtils.isEmpty( PassWord )){ Toast.makeText( context," PassWord不能为空",Toast.LENGTH_SHORT ).show(); Back; Business = new NetWorkBusiness( AccessToken, Param.URL );business.signIn( new SignIn( UserName, PassWord ), new NCallBack (getApplicationContext()) { @Override protected void onResponse(BaseResponseEntity 响应) {@Override public void onResponse(调用 incalling,response response){ super.onResponse(调用,response); if (body != null && body.getStatus() == 0); new SP( context ); AccessToken = body.getResultObj().getAccessToken(); /*将 AccessToken 保存到 sp*/ sp.PutData( context,"AccessToken",AccessToken ); makeText( context,"登录成功",Toast.LENGTH_SHORT ).show(); }else { Toast.makeText( context,"登录失败",Toast.LENGTH_SHORT ).show();void onFailure(Call call, Throwable t) { super.onFailure( call, t ); Toast.makeText( context,"Exception",Toast.LENGTH_SHORT ).show() } } ); / public void Exit(View view){ ReturnActivity(WelComeActivity.class); } /*登录按钮*/ public void Login(View view){ LoginMethod(); private void ReturnActivity(Class Activity){ startActivity( new Intent( context, Activity ) ); }} MainActivity 效果图说明

顶部的两个圆形进度条根据传入的数据而变化。 更改样式的规则如下:

排队人数上限为20人,如果多则设置。 实时出现,但不链接到触发式效果。 如果人数为 10 人或更少,则外部弧线和文字将为绿色。 11- 对于 20 人,外部弧线和字母将为紫色。 如果人数超过20人,外弧线和文字将为红色。 中间的输入框是音频模块。 输入的字符串通过云平台发送到底层设备,底层设备相应地广播相关内容。 如果单击“取消队列”,所有功能将变灰并且不再起作用。 仅“排队”按钮可用。 否则,可以使用排队,其他所有按钮,但不能使用排队按钮上的代码/** * 作者:FranzLiszt * 功能:排队 * 提示:最多设置20人排队,超过20人将被添加到队列中。 习惯了会显示,但链接时不会激活样式效果。* 如果人数在 10 人以下,则外圈弧线和文字将为绿色。* 11- 如果有 20 人,外圈弧线和文字将为会是绿色的*如果超过20人,外弧和文字会是紫色,文字会是红色*没有硬件限制,但是软件会限制人数*//* * * 基本思路: * 抓号:获取号码并开始排队。 * 呼叫号码:当您前面的人数少于3人时,系统将接入站点处理业务请求。 无需排队。 函数变灰*/public class MainActivity extends AppCompatActivity { /*圆形进度条上方提示文字* 功能: Change 改变进度条外弧颜色 */ private TextView Text_CurrentPeople, Text_CurrentTime; 功能: 外弧进度条弧线根据队列人数和剩余时间而变化*/ private ProgressBarView CurrentPeople,CurrentTime; /*输入内容*/ private EditText InputMessage; /*按键*/ private Button SendMessage,ReadProgress,ReadRecord,LineUp,CancelLineUp ; PrivaterelativeLayoutTipLayout; private TextViewTipText,btn_Agree,pop_TipAgree; Private string AccessToken = ""; private context context = null; /*用于决定是否取消队列并挂起线程*/private boolean flag = true; /*用于加载排队获取服务器的人数*/ private int mCurrentNumber; /*加载获取服务器的等待时间 用于 * 时间 = 人数 * 5 * 自定义基数 * / private int mCurrentWaitTime; /* 用于判断队列是否排队。 如果已排队,则无法单击队列按钮 */ private boolean EnableFlag = false; Private Thread Thread. 私有布尔DialogFlag = true; 私有PopupWindow,mPopupWindow_2 私有视图TipView,TipView_2; 私有静态最终整数START = 1; @Override public void handleMessage(@NonNull Message msg) { super.handleMessage( msg ); { case COMPLETE: CompleteQueuing(); }开始情况:GetAndSet(); 停止情况:clearStyle() } } }; @Override protected void onCreate(Bundle SavedInstanceState) { super.onCreate(savedInstanceState ); { View DecorView = getWindow().getDecorView(); DecorView.setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE ); getWindow().setStatusBarColor( Color.TRANSPARENT ); (); GetCurrentPeople(); } /** * 名称:InitView * 功能:初始化控件 */ private void InitView(){ Text_CurrentPeople = findViewById( R.id.Text_CurrentPeople ); Text_CurrentTime = findViewById( R.id.Text_CurrentTime ); InputMessage = findViewById( R.id.InputMessage ); ; ReadProgress = findViewById( R.id.ReadProgress ); ReadRecord = findViewById( R.id.ReadRecord ); LineUp = findViewById( R.id.btn_LineUp ); CancelLineUp = findViewById( R.id.btn_CancelLineUp ); .id.CurrentPeople ); CurrentTime = findViewById( R.id.CurrentTime ); TipLayout = findViewById( R.id.TipLayout ); TipText = findViewById( R.id.TipText ); .this; } 排队。setBackgroundResource( R.drawable.btn_notenable ); LineUp.setEnabled( false ); } /** * 名称:GetSpValue * 功能:获取 AccessToken * 实例化 NetWorkBusiness 对象 */ private void GetSpValue(){ sp = new SP( context ); = (String) sp.GetData( context,"AccessToken","" ); 业务 = new NetWorkBusiness( AccessToken, Param.URL ); } private void GetCurrentPeople(){ thread = new Thread( ){ @Override public void run ( ) { super.run(); while (true) { while (flag) { try { Thread.sleep( 3000 ); } catch (InterruptedException e) { e.printStackTrace();消息消息 = new Message(); message.what = START; } } } }; , new NCallBack>(context) { @Override protected void onResponse(BaseResponseEntity> response) { } @Override public void onResponse(Call> call, Response> response) { super.onResponse(call, response); } ); if (body!=null && body.getStatus() == 0){ mCurrentNumber = Integer.parseInt( body.getResultObj() . ​get (0 ).getValue() ); mCurrentNumber * 5; sp.PutData( context,"CurrentNumber",mCurrentNumber ); sp.PutData( context,"CurrentWaitTime",mCurrentWaitTime ); k4]>{ if (mCurrentNumber >= 20){ /*人数大于20,红色*/ DialogFlag = true; DisplayLayout_Queuing(); }else if (mCurrentNumber 10 ){ /* 人数为 10 -20,紫色*/ setViolet() = true; else if (mCurrentNumber 3){ /*人数小于 10,绿色*/ setGreen();DisplayLayout_Queuing(); }else if (mCurrentNumber 0){ if (DialogFlag){ flag = false; message.what = did; handler.sendMessage( message ); Control(String DeviceID,String Tag,Object value){business.control(DeviceID, Tag, value, new NCallBack(getApplicationContext()) { @Override protected void onResponse(BaseResponseEntity response) { } @Override public void onResponse( call call,响应 响应) { super.onResponse(call, response) body = response.body();null && body.getStatus() != 0){ Toast.makeText( context, "请求失败", Toast.LENGTH_SHORT ).show(); @Override public void onFailure(Call call, Throwable t) { super. , t ); Toast.makeText( context, "Exception", Toast.LENGTH_SHORT ); } } ); } private void SendVoiceMessage(){ String Message = InputMessage.getText().toString(). ; Control( Param.DEVICEID,Param.VOIVE,Message ); } private void InitPopWidows(){ TipView = LayoutInflater.from( context ).inflate( R.layout.pop_item,null ); .btn_Agree ); mPopupWindow = new PopupWindow( TipView, ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT ); mPopupWindow.setFocusable( true ); //获取焦点 mPopupWindow.setBackgroundDrawable( new BitmapDrawable() ); //点击外部取消 mPopupWindow.setTouchable( true ); mPopupWindow.setAnimationStyle( R.style.PopupWindow ); //设置动画 btn_Agree.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { //EnableFlag = true; setGrey( ); setStyleInvalid() ; setButtonNotEnabled(); /*手机振动*/ 振动器 Vibrator = (Vibrator) getSystemService( Service.VIBRATOR_SERVICE) mPopupWindow.dismiss();TipView_2 = LayoutInflater.from( context ).inflate( R.layout.tip_pop_item,null ); Pop_TipText = TipView_2.findViewById( R.id.pop_TipsText ); Pop_TipAgree = TipView_2.findViewById( R.id.pop_TipAgree ); ( TipView_2, ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT ); mPopupWindow_2.setFocusable( true ); //获取焦点 mPopupWindow_2.setBackgroundDrawable( new BitmapDrawable() ); //点击外部并取消mPopupWindow_2.setTouchable( true ); //允许点击 mPopupWindow_2.setAnimationStyle( R.style.PopupWindow ); //设置动画 Pop_TipAgree.setOnClickListener( new View.OnClickListener() { @Override public void onClick( View v) { mPopupWindow_2.dismiss(); } } ); } private void DisPlayPopWindows(){ mPopupWindow.showAtLocation( TipView, Gravity.CENTER,0,0 ); } private void ShowPopWindows(){ Pop_TipText.setText( "当前 } private void DisplayLayout_Queuing( ){ TipLayout.setVisibility( View.VISIBLE ); TipText.setText( "这是当前队列,请礼貌排队" ); } private void DisplayLayout_CancelQueuing(){ TipLayout.setVisibility( View.VISIBLE );当前号码已停用,请重新排队" ); } private void DisplayLayout_CallNumber(){ TipLayout .setVisibility( View.VISIBLE ); TipText.setText( "排队已完成,请亲临现场处理业务。" ); private void比较leteQueuing(){ /*少于3人时提示*/ DisPlayPopWindows(); private void setRed(){ Text_CurrentPeople.setTextColor( getResources().getColor( R.color.colorRed ) ) ; setTextColor ( getResources().getColor( R.color.colorRed ) ); Text_CurrentPeople.setText( mCurrentNumber+getResources().getString( R.string.Tips_2 ) ); Text_CurrentTime.setText( mCurrentWaitTime+"Min" ); 100 ); CurrentPeople.setCircleColor( getResources().getColor( R.color.colorRed ) ); CurrentPeople.setContent( "拥挤" ); CurrentTime.setProgress( 100 ); .colorRed ) ); 当前时间.setContent(“长时间”);我吃了 void setViolet(){ Text_CurrentPeople.setTextColor( getResources().getColor( R.color.colorViolet ) ); Text_CurrentTime.setTextColor( getResources().getColor( R.color.colorViolet ) ); Text_CurrentPeople.setText( mCurrentNumber+ getResources( ).getString( R.string.Tips_2 ) ); Text_CurrentTime.setText( mCurrentWaitTime+"Min" ); CurrentPeople.setProgress( mCurrentWaitTime ); CurrentPeople.setCircleColor( getResources().getColor( R.color.colorViolet ) ); ( "Normal" ); CurrentTime.setProgress( mCurrentWaitTime ); CurrentTime.setCircleColor( getResources().getColor( R.color.colorViolet ) ); CurrentTime.setContent( "及时" );设置文本颜色(getResources().getColor( R.color.colorGreen ) ); Text_CurrentTime.setTextColor( getResources().getColor( R.color.colorGreen ) ); Text_CurrentPeople.setText( mCurrentNumber+getResources().getString( R.string.Tips_2 ) ); Text_CurrentTime.setText( mCurrentWaitTime+"Min" ); CurrentPeople.setProgress( mCurrentWaitTime ); CurrentPeople.setCircleColor( getResources().getColor( R.color.colorGreen ) ); CurrentPeople.setContent( "Unblock" ); mCurrentWaitTime ); CurrentTime.setCircleColor( getResources().getColor( R.color.colorGreen ) ); CurrentTime.setContent( "短时间" ); private void setGrey(){ Text_CurrentPeople.setTextColor( getResources().getColor( R. color ); .colorGrey));Text_CurrentTime.setTextColor( getResources().getColor( R.color.colorGrey ) ); Text_CurrentPeople.setText( "0"+getResources().getString( R.string.Tips_2 ) ); Text_CurrentTime.setText( "0 分钟" ); CurrentPeople.setProgress( 0 ); CurrentPeople.setCircleColor( getResources().getColor( R.color.colorGrey ) ); CurrentPeople.setContent( "无" ); CurrentTime.setCircleColor( getResources().getColor ( R.color.colorGrey ) ); CurrentTime.setContent( "None" ); } /*无法点击按钮*/ private void setButtonNotEnabled(){ SendMessage.setEnabled( false );错误 );InputMessage.setEnabled( false ); LineUp.setEnabled( true ); InputMessage.setText( "" ); } /*StyleGray*/ private void setStyleInvalid(){ SendMessage.setBackgroundResource( R.drawable.btn_notenable ); .drawable.btn_notenable ); ReadRecord.setBackgroundResource( R.drawable.btn_notenable ); CancelLineUp.setBackgroundResource( R.drawable.btn_notenable ); LineUp.setBackgroundResource( R.drawable.btn_login ); setNormalStyle(){ SendMessage.setBackgroundResource( R.drawable.btn_login ); ReadProgress.setBackgroundResource( R.drawable.btn_login ); ReadRecord.setBackgroundResource( R.drawable.btn_login );le.btn_login ); LineUp.setBackgroundResource( R.drawable.btn_notenable ); } /*按钮允许点击*/ private void setButtonEnabled(){ SendMessage.setEnabled( true ); ReadProgress.setEnabled( true ); ; CancelLineUp.setEnabled( true ); InputMessage.setEnabled( false ); } private void NormalStyle(){ Flag = true; setButtonEnabled(); (); message.what = START; handler.sendMessage( message ); } /*队列取消状态*/ private voidclearStyle(){ Flag = false; setButtonNotEnabled() ) ; 设置样式无效d(); } 私有 void StopThread(){ 标志 = false; { 尝试 thread.join( 1000 ); } catch (InterruptedException e) { e.printStackTrace message = new Message.what = stop; handler.sendMessage( message ); } /*返回按钮*/ public void Exit(View view){ ReturnActivity ( LoginActivity.class ); } private void ReturnActivity(Class Activity){ startActivity( new Intent( context,Activity ) ) ; } private void Listener(){ OnClick onClick = new SendMessage.setOnClickListener( onClick ); setOnClickListener( onClick ); ReadProgress.setOnClickListener( onClick );ener(onClick); } class OnClickimplements View.OnClickListener{ @Override public void onClick(View v) { switch (v.getId()){ case R.id.SendMessage: SendVoiceMessage() destroy; ); 案例 R.id.btn_CancelLineUp: StopThread(); 案例 R.id.ReadProgress: ShowPopWindows(); 案例 R.id.ReadRecord: ReturnActivity( HistoricalDataActivity.class ); HistoricalDataActivity渲染说明

通过在子线程中实时检索数据并通过runOnUiThread跳转到主线程来实时更新UI。,具体用法这里就不说了,但是基本上代码中每条语句都有注释。

代码 public class HistoricalDataActivity extends AppCompatActivity { private LineChart LineChart; private String[] mDate; // 线条集合。 所有折线都是数组的形式。 保存到这个集合。 private LineDataSet mDataSet; // 点集合,即折线 private List mEntries; // 条目是折线上的点,列表封装在 LineDataSet 中 private Timer mTimer; // 定时器,动态获取 Data private NetWorkBusiness mNetWorkToken; SPsp; 私有上下文 context = null; @Override protected void onCreate(Bundle SavedInstanceState) { super.onCreate(savedInstanceState ); if (Build.VERSION.SDK_INT >= 21) { View DecorView = getWindow().getDecorView(); setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE ); getWindow().setStatusBarColor( Color.TRANSPARENT ); setContentView( R.layout.activity_historyal_data ); InitLineChart(); } private void InitView(){ LineChart = findViewById( R.id.LineChart ); (context == null){ context = HistoricalDataActivity.this sp = new SP( context ); sp.GetData( context,"AccessToken","" ); ); public void Exit(View view){ startActivity( new Intent( context,MainActivity.class ) ); } private void InitLineChart(){ LineChart.getDescription().setText("time");//设置图表描述文本显示在图表的右下角。 LineChart.getLegend().setEnabled(false); LineChart.setTouchEnabled(true);//启用或禁用与图表的所有可能的触摸交互。 LineChart.setDragEnabled(true);// 启用或禁用图表拖动(平移)。 LineChart.setScaleEnabled(true);//启用或禁用缩放图表的两个轴。 LineChart.setDrawGridBackground(true);//如果启用,图表绘制区域后面会绘制一个背景矩形。 LineChart.setPinchZoom(false);//如果设置为true,则没有缩放功能。 如果为 false,则 x 轴和 y 轴可以独立缩放。 LineChart.setBackgroundColor(getResources().getColor( R.color.colorWhite ));//设置覆盖整个图表视图的背景色。 此外,背景颜色可以在布局文件.xml 中设置。 LineChart.setBorderColor( getResources().getColor( R.color.colorBlue_1 ) );// 设置图表边框颜色 LineChart.setBorderWidth( 1 ); //setBorderWidth(float width): 设置图表边框颜色 设置宽度在 dp 中。 LineChart.getAxisRight().setEnabled(false);//禁用右轴绘制 /*X轴数据*/ XAxis xAxis = LineChart.getXAxis(); xAxis.setPosition(XAxis.XAxisPositio);n.bottom); xAxis.setDrawGridLines(false);// 如果设置为 true,则绘制网格线。 xAxis.setLabelCount(5,false); //强制:false,建议刻度标签数量为10 xAxis.setTextSize(5); xAxis.setGridColor( getResources().getColor( R.color.colorViolet) ); .setValueFormatter( new ValueFormatter() { @Override public String getFormattedValue(float value) { return mDate[(int) value]; } } ); /*Y 轴数据*/ YAxis yAxis = LineChart.getAxisLeft(); (0f); // 设置 y 轴坐标最小值为 0(人数为 0 或以上) yAxis.setGranularity(1f); // 设置 y 轴坐标之间的最小间隔为 1(单位) : people) yAxis.setLabelCount (10, false); //强制:false,建议刻度标签数量仅 12 yAxis.setGridColor(getResources().getColor( R.color.colorViolet)); ;mDataSet = new LineDataSet(mEntries, "排队人数"); // 禁用折线点的绘制 mDataSet.setHighlightEnabled(true); // 突出显示选定点 禁用 mDataSet.setColor(getResources() .getColor ( R.color.colorBlue_1)); // 折线颜色 mDataSet.setValueFormatter(new ValueFormatter() { @Override public String getFormattedValue(float value) { return ""; } });折线图。 setData(mLineData); // 更新视图 mTimer = new Timer.schedule( new TimerTask() { @Override public void run() { mNetWorkBusiness.getSensorData( Param.DEVICEID, Param.QUEUENUMBER , "1", "1", null, null, "ASC", "10", "1", new NCallBack(context) { @Override protected void onResponse(BaseResponseEntity response) { } @Override public void onResponse(Call call, Response response) { super.onResponse( call, response ); 列表 body = response.body().getResultObj().DataPoints ; if (body == null){ return; }else { list list = body.get(0).PointDTO; SensorDataPageDTO.VR[] array = new SensorDataPageDTO.VR[list.size()]; mDataSet.clear(); mDate = 新字符串[数组长度];// = 0; for (int idx = 0; idx { // 通知 LinData 数据已更改以重新计算绘图参数 LineChart.getLineData().notifyDataChanged(); // 让 ChartLine 知道其基本信息为数据更改并执行所有必要的计算 每当数据动态更改时,调用此方法失败可能会导致崩溃或意外行为。} },100,2000 ); @Override protected void onDestroy() { super.onDestroy(); }} 背景数据

总结

我们还有很长的路要走。 ,上下搜索

未经允许不得转载:主机频道 » 基于nlecloud(新世界)的智能排队机的实现-Android端

评论 抢沙发

评论前必须登录!