D
DeJe
Dauer-User
- 437
Ich stecke fest. 
Ich versuche eine Real-Time Anzeige für ein Gerät zu realisieren. Konkret geht es um eine Portalfräse mit LinuxCNC. Diese kann ich per IP kontrollieren/abfragen. Zunächst möchte ich die Positionsabfrage realisieren. Die Kommunikation erfolgt über ein Telnet-Interface.
Ich schicke ein Komando z.B. "get rel_act_pos" und die Anlage reagiert mit "GET REL_ACT_POS xxx.xxxx yyy.yyyy zzz.zzzz nnn.nnnn ...".
Soweit, so gut. Das funktioniert und ich bekomme die Daten rein. Mein Problem ist, das sich Netzwerk-Aktivitäten und UI-Aktivitäten unter Android spinnefeind sind.
Da das Update aber durchaus mit vernünftiger FPS erfolgen soll, weiß ich einfach nicht weiter, wie ich das am besten löse...
Hier mal mein Code der bis auf das Update der UI super funktioniert.
Zur Erklärung: Der TimerTask sendet die Abfrage. Der AsyncTask soll eigentlich permanent auf dem InputStream horchen und wenn etwas da ist die UI updaten.
Das Problem: Entweder darf ich keine Netzwerkaktivitäten (insbesondere Lesen) ausführen oder keine UI-Aktivitäten!
Andererseits möchte ich aus Performance Gründen nicht dauernd Threads/Tasks/Prozesse starten und beenden. Oh, noch ein Problem: readLine blockiert wenn keine Daten da sind. Das ist also ebenfalls gefährlich. 
Vielleicht hat jemand den zündenden Einfall...wie das einfach zu lösen wäre.
Danke,
DeJe
Ich versuche eine Real-Time Anzeige für ein Gerät zu realisieren. Konkret geht es um eine Portalfräse mit LinuxCNC. Diese kann ich per IP kontrollieren/abfragen. Zunächst möchte ich die Positionsabfrage realisieren. Die Kommunikation erfolgt über ein Telnet-Interface.
Ich schicke ein Komando z.B. "get rel_act_pos" und die Anlage reagiert mit "GET REL_ACT_POS xxx.xxxx yyy.yyyy zzz.zzzz nnn.nnnn ...".
Soweit, so gut. Das funktioniert und ich bekomme die Daten rein. Mein Problem ist, das sich Netzwerk-Aktivitäten und UI-Aktivitäten unter Android spinnefeind sind.

Hier mal mein Code der bis auf das Update der UI super funktioniert.
Code:
package com.example.navigationdrawer;
import java.io.IOException;
import java.util.StringTokenizer;
import java.util.Timer;
import java.util.TimerTask;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
public class FragmentOne extends Fragment {
static FragmentOne f = null;
static Button pos[] = { null, null, null };
public static Fragment newInstance(Context context) {
f = new FragmentOne();
return f;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_one, null);
pos[0] = (Button)root.findViewById(R.id.posX);
pos[1] = (Button)root.findViewById(R.id.posY);
pos[2] = (Button)root.findViewById(R.id.posZ);
(new readRelPos()).execute("","","");
Timer timerDRO = new Timer();
final int FPS = 30;
TimerTask updateDRO = new UpdateDROTask();
timerDRO.scheduleAtFixedRate(updateDRO, 0, 30000/*1000/FPS*/);
return root;
}
static class UpdateDROTask extends TimerTask {
public void run() {
MainActivity.mOut.println("get rel_act_pos");
}
}
static class readRelPos extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... params) {
String mh = "";
try {
while( MainActivity.mIsConnected ) {
mh = MainActivity.mIn.readLine();
if( mh.startsWith("REL_ACT_POS") ) {
int i = 0;
StringTokenizer st = new StringTokenizer(mh);
st.nextToken();
while (st.hasMoreElements()) {
if( i > 2 ) break;
mh = st.nextToken();
//? that one doesn't work pos[i].setText(st.nextToken());
i++;
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
return mh;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
}
}
}
Zur Erklärung: Der TimerTask sendet die Abfrage. Der AsyncTask soll eigentlich permanent auf dem InputStream horchen und wenn etwas da ist die UI updaten.
Das Problem: Entweder darf ich keine Netzwerkaktivitäten (insbesondere Lesen) ausführen oder keine UI-Aktivitäten!

Vielleicht hat jemand den zündenden Einfall...wie das einfach zu lösen wäre.
Danke,
DeJe