问题描述
我是 Android 新手,我添加了 Modbus 客户端库以从它在前台成功工作的 modbus 设备接收数据,使用发送到 UI 的广播接收器,将数据传递给下图的 recyclerview 项目(更改数据 Text1、Text2、Text3,文本 4、文本 5)
下面的代码
前台服务.java
public class ForegroundService extends Service {
public static final String CHANNEL_ID = "ForegroundServiceChannel";
public static final String NOTIFICATION_CHANNEL_ID = "10001" ;
private final static String default_notification_channel_id = "default" ;
MyServiceThread myServiceThread;
final static String KEY_INT_FROM_SERVICE = "KEY_INT_FROM_SERVICE";
final static String KEY_INT_FROM_SERVICE2 = "KEY_INT_FROM_SERVICE2";
final static String KEY_INT_FROM_SERVICE3 = "KEY_INT_FROM_SERVICE3";
final static String KEY_INT_FROM_SERVICE4 = "KEY_INT_FROM_SERVICE4";
final static String KEY_INT_FROM_SERVICE5 = "KEY_INT_FROM_SERVICE5";
final static String ACTION_UPDATE_CNT = "UPDATE_CNT";
int cnt;
String ret = "";
int val1 = 0;
int val2 = 0;
int val3 = 0;
int val4 = 0;
int val5 = 0;
@Override
public void onCreate() {
ModbusReq.getInstance().setParam(new Modbusparam()
.setHost("10.0.2.2")
.setPort(502)
.setEncapsulated(false)
.setKeepAlive(true)
.setTimeout(2000)
.setRetries(0))
.init(new OnRequestBack<String>() {
@Override
public void onSuccess(String s) {
Log.d("TAG","onSuccess " + s);
}
@Override
public void onFailed(String msg) {
Log.d("TAG","onSuccess " + msg);
}
});
super.onCreate();
}
@Override
public int onStartCommand(Intent intent,int flags,int startId) {
String input = intent.getStringExtra("inputExtra");
createNotificationChannel();
Intent notificationIntent = new Intent(this,MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this,notificationIntent,0);
Notification notification = new NotificationCompat.Builder(this,CHANNEL_ID)
.setContentTitle("Foreground Service")
.setContentText(input)
.setSmallIcon(R.drawable.notification)
.setContentIntent(pendingIntent)
.build();
startForeground(1,notification);
myServiceThread = new MyServiceThread();
myServiceThread.start();
return START_NOT_STICKY;
}
@Override
public void onDestroy() {
myServiceThread.setRunning(false);
super.onDestroy();
}
private class PlcReader extends AsyncTask<String,Void,String> {
@Override
protected String doInBackground(String... strings) {
try{
ModbusReq.getInstance().readHoldingRegisters(new OnRequestBack<short[]>() {
@Override
public void onSuccess(short[] data) {
val1 = data[0];
val2 = data[1];
val3 = data[2];
val4 = data[3];
val5 = data[4];
}
@Override
public void onFailed(String msg) {
Log.e("TAG","readHoldingRegisters onFailed " + msg);
}
},1,8);
}
catch (Exception e)
{
ret= "Exe"+e.toString();
Thread.interrupted();
}
return "Executed";
}
@Override
protected void onPostExecute(String s) {
Intent intent = new Intent();
intent.setAction(ACTION_UPDATE_CNT);
intent.putExtra(KEY_INT_FROM_SERVICE,val1);
intent.putExtra(KEY_INT_FROM_SERVICE2,val2);
intent.putExtra(KEY_INT_FROM_SERVICE3,val3);
intent.putExtra(KEY_INT_FROM_SERVICE4,val4);
intent.putExtra(KEY_INT_FROM_SERVICE5,val5);
sendbroadcast(intent);
}
},delayInMilliseconds) ;
}
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
private void createNotificationChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel serviceChannel = new NotificationChannel(
CHANNEL_ID,"Foreground Service Channel",notificationmanager.IMPORTANCE_DEFAULT
);
notificationmanager manager = getSystemService(notificationmanager.class);
manager.createNotificationChannel(serviceChannel);
}
}
private class MyServiceThread extends Thread{
private boolean running;
public void setRunning(boolean running){
this.running = running;
}
@Override
public void run() {
cnt = 0;
running = true;
while (running){
try {
Thread.sleep(1000);
cnt++;
new PlcReader().execute("");
} catch (InterruptedException e) {
e.printstacktrace();
}
}
}
}
}
TextAdapter.java
public class TextAdapter extends RecyclerView.Adapter<TextAdapter.ItemViewHolder> {
private Context context;
private String[] Values = {"Text 1","Text 2","Text 3","Text 4","Text 5"};
private String[] City = {"dubai","Italy","India","USA","UK"};
public TextAdapter(Context context) {
this.context = context;
}
@NonNull
@Override
public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item_layout,parent,false);
return new ItemViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ItemViewHolder holder,int position) {
holder.txtView.setText(Values[position]);
holder.txtView2.setText(City[position]);
}
@Override
public int getItemCount() {
return Values.length;
}
class ItemViewHolder extends RecyclerView.ViewHolder{
private TextView txtView;
private TextView txtView2;
public ItemViewHolder(@NonNull View itemView) {
super(itemView);
txtView = itemView.findViewById(R.id.txtView);
txtView2 = itemView.findViewById(R.id.cities);
}
}
}
RecycerActivity.java
public class RecyclerActivity extends AppCompatActivity {
private RecyclerView recyclerView;
MyMainReceiver myMainReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new linearlayoutmanager(this));
recyclerView.setHasFixedSize(true);
TextAdapter textAdapter = new TextAdapter(getApplicationContext());
recyclerView.setAdapter(textAdapter);
}
@Override
protected void onStart() {
myMainReceiver = new MyMainReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ForegroundService.ACTION_UPDATE_CNT);
registerReceiver(myMainReceiver,intentFilter);
super.onStart();
}
private class MyMainReceiver extends broadcastReceiver {
@Override
public void onReceive(Context context,Intent intent) {
String action = intent.getAction();
if(action.equals(ForegroundService.ACTION_UPDATE_CNT)){
int int_from_service = intent.getIntExtra(ForegroundService.KEY_INT_FROM_SERVICE,0);
int int_from_service2 = intent.getIntExtra(ForegroundService.KEY_INT_FROM_SERVICE2,0);
int int_from_service3 = intent.getIntExtra(ForegroundService.KEY_INT_FROM_SERVICE3,0);
int int_from_service4 = intent.getIntExtra(ForegroundService.KEY_INT_FROM_SERVICE4,0);
int int_from_service5 = intent.getIntExtra(ForegroundService.KEY_INT_FROM_SERVICE5,0);
Toast.makeText(getApplicationContext(),String.valueOf(int_from_service3),Toast.LENGTH_LONG).show();
}
}
}
}
线程在前台服务每1秒运行一次,每秒钟从前台服务到Recycler视图项的数据帮我解决了这个问题
解决方法
您的回收器适配器中应该有一个更新方法,当您收到新数据时,您可以从您的活动中调用该更新方法并显示新数据。