- Honor Magic5 Pro - kamerák bűvöletében
- Mobil flották
- Samsung Galaxy A54 - türelemjáték
- Android alkalmazások - szoftver kibeszélő topik
- Xiaomi 13T és 13T Pro - nincs tétlenkedés
- Samsung Galaxy S21 FE 5G - utóirat
- Yettel topik
- Redmi Note 13 5G - fogyókúra után
- Samsung Galaxy S24 Ultra - ha működik, ne változtass!
- iPhone topik
Hirdetés
-
Lenovo Essential Wireless Combo
lo Lehet-e egy billentyűzet karcsú, elegáns és különleges? A Lenovo bebizonyította, hogy igen, de bosszantó is :)
-
VR játék lesz az Alien: Rogue Incursion
gp Az év végén érkező program PC-re, Meta Quest 3-ra és PlayStation VR2-re érkezik a tervek szerint.
-
Olcsó 5G-s ajánlatot nyújt a Realme Indiának
ma Megérkezett a Realme C65 5G, az első készülék a MediaTek Dimensity 6300-zal.
Új hozzászólás Aktív témák
-
köszönöm! Ez lesz a baja, mert a telefon 4.1.1, az api17 meg 4.2.2. Ha csak simán kimásolom a bin mappából akkor viszont működik szerencsére. Akkor az első lépéseket megtettem Ez a java így elsőre valami borzalom. Pascalt, meg php-t tanultam, meg használtam, ahhoz képest elég fura.
Eladó Lego: 42139 All terrain vehicle
-
Karma
félisten
Megjegyzés: a Sun JVM a nagyon rövid stringeket cacheli, tehát pl. egy három hosszúságú stringnél előfordulhat, hogy a == igaz lesz. A Dalvik nem tudom csinál-e ilyet, de még ha csinál is, erre nem szabad alapozni. Egyenlőség tesztelésre csak az equals való.
“All nothings are not equal.”
-
shinodas
tag
Köszi a válaszokat! Azt hiszem megoldottam, már csak egy apróság (ELnézést a tényleg primitív kérdéseimért, de tényleg abszolút kezdő vagyok)
Szóval a logcat azt mondja, h kapcsolódni próbál az eszköz de nem tudja azt befejezni, először azt írja, hogy kapcsolódva, majd 2 sorral lejjebb már ugyan ez az állapot false.import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.UUID;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Context;
import android.os.Handler;
import android.util.Log;
public class BluetoothConnection extends Thread {
private BluetoothAdapter bluetooth = null;
private BluetoothSocket socket = null;
private InputStream inputStream = null;
private OutputStream outputStream = null;
private static final UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
static final int BL_NOT_AVAILABLE = 1;
static final int BL_SOCKET_FAILED = 2;
protected static final int BL_INCORRECT_ADDRESS = 3;
private Handler mHandler = null;
public BluetoothConnection(Context context, Handler handler){
bluetooth = BluetoothAdapter.getDefaultAdapter();
mHandler = handler;
if(bluetooth == null){
mHandler.sendEmptyMessage(BL_NOT_AVAILABLE);
return;
}
}
public void BT_Connect(String Address){
Log.d("CONNECTION", "...On Resume...");
String address = Address;
if(!BluetoothAdapter.checkBluetoothAddress(address)){
return;
}else{
BluetoothDevice device = bluetooth.getRemoteDevice(address);
try{
socket = device.createRfcommSocketToServiceRecord(uuid);
}catch(IOException e){
Log.d("RFCOMM", "socket create fail" + e.getMessage());
mHandler.sendEmptyMessage(BL_SOCKET_FAILED);
return;
}
bluetooth.cancelDiscovery();
[B]Log.d("BLUETOOTH", "-----CONNECTING---"); //idáig jut[/B]
try{
socket.connect();
Log.d("BLUETOOTH", "Connecting is ok");
}catch(IOException e){
try{
socket.close();
}catch(IOException e2){
Log.d("BLUETOOTH", "In onResume() and unable to close socket during connection failure" + e2.getMessage());
mHandler.sendEmptyMessage(BL_SOCKET_FAILED);
return;
}
}
}
}
}LOGCAT:
06-07 12:48:35.200: I/ActivityManager(231): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.hxxpd/.MainActivity } from pid 11341
06-07 12:48:35.270: D/CONNECTION(11934): ...On Resume...
06-07 12:48:35.280: E/BluetoothService.cpp(231): stopDiscoveryNative: D-Bus error in StopDiscovery: org.bluez.Error.Failed (Invalid discovery session)
06-07 12:48:35.280: D/BLUETOOTH(11934): -----CONNECTING---
06-07 12:48:35.740: E/BluetoothEventLoop.cpp(231): event_filter: Received signal org.bluez.Device:PropertyChanged from /org/bluez/10666/hci0/dev_CC_AF_78_B4_F7_6A
06-07 12:48:35.740: D/BluetoothService(231): setRemoteDeviceProperty addr = CC:AF:78:B4:F7:6A name = Connected value = true
06-07 12:48:37.090: D/BluetoothService(231): updateDeviceServiceChannelCache(CC:AF:78:B4:F7:6A)
06-07 12:48:37.110: D/BluetoothService(231): uuid(system): 0000111e-0000-1000-8000-00805f9b34fb 3
06-07 12:48:37.120: D/BluetoothService(231): uuid(system): 00001105-0000-1000-8000-00805f9b34fb 10
06-07 12:48:37.140: V/BluetoothEventRedirector(11975): Received android.bleutooth.device.action.UUID
06-07 12:48:37.140: D/BluetoothService(231): Cleaning up failed UUID channel lookup: CC:AF:78:B4:F7:6A 00001101-0000-1000-8000-00805f9b34fb
06-07 12:48:37.330: E/CachedBluetoothDevice(11975): updating profiles for JABBA
06-07 12:48:37.330: V/CachedBluetoothDevice(11975): Class: 7e010c
06-07 12:48:37.330: V/CachedBluetoothDevice(11975): UUID:
06-07 12:48:37.360: V/CachedBluetoothDevice(11975): 00001000-0000-1000-8000-00805f9b34fb
06-07 12:48:37.390: V/CachedBluetoothDevice(11975): 00001104-0000-1000-8000-00805f9b34fb
06-07 12:48:37.390: V/CachedBluetoothDevice(11975): 00001105-0000-1000-8000-00805f9b34fb
06-07 12:48:37.390: V/CachedBluetoothDevice(11975): 00001106-0000-1000-8000-00805f9b34fb
06-07 12:48:37.410: V/CachedBluetoothDevice(11975): 0000110a-0000-1000-8000-00805f9b34fb
06-07 12:48:37.420: V/CachedBluetoothDevice(11975): 0000110b-0000-1000-8000-00805f9b34fb
06-07 12:48:37.420: V/CachedBluetoothDevice(11975): 0000110c-0000-1000-8000-00805f9b34fb
06-07 12:48:37.420: V/CachedBluetoothDevice(11975): 0000110e-0000-1000-8000-00805f9b34fb
06-07 12:48:37.420: V/CachedBluetoothDevice(11975): 00001112-0000-1000-8000-00805f9b34fb
06-07 12:48:37.440: V/CachedBluetoothDevice(11975): 00001115-0000-1000-8000-00805f9b34fb
06-07 12:48:37.440: V/CachedBluetoothDevice(11975): 0000111b-0000-1000-8000-00805f9b34fb
06-07 12:48:37.470: V/CachedBluetoothDevice(11975): 0000111e-0000-1000-8000-00805f9b34fb
06-07 12:48:37.470: V/CachedBluetoothDevice(11975): 0000111f-0000-1000-8000-00805f9b34fb
06-07 12:48:37.470: V/CachedBluetoothDevice(11975): 00001123-0000-1000-8000-00805f9b34fb
06-07 12:48:37.470: V/CachedBluetoothDevice(11975): 0350278f-3dca-4e62-831d-a41165ff906c
06-07 12:48:37.470: E/CachedBluetoothDevice(11975): onUuidChanged: Time since last connect67267896
06-07 12:48:41.100: E/BluetoothEventLoop.cpp(231): event_filter: Received signal org.bluez.Device:PropertyChanged from /org/bluez/10666/hci0/dev_CC_AF_78_B4_F7_6A
06-07 12:48:41.100: D/BluetoothService(231): setRemoteDeviceProperty addr = CC:AF:78:B4:F7:6A name = Connected value = false
06-07 12:48:41.330: V/BluetoothEventRedirector(11975): Received android.bleutooth.device.action.UUID
06-07 12:48:41.350: E/CachedBluetoothDevice(11975): updating profiles for JABBA
06-07 12:48:41.350: V/CachedBluetoothDevice(11975): Class: 7e010c
06-07 12:48:41.350: V/CachedBluetoothDevice(11975): UUID:
06-07 12:48:41.350: V/CachedBluetoothDevice(11975): 00001000-0000-1000-8000-00805f9b34fb
06-07 12:48:41.350: V/CachedBluetoothDevice(11975): 00001104-0000-1000-8000-00805f9b34fb
06-07 12:48:41.350: V/CachedBluetoothDevice(11975): 00001105-0000-1000-8000-00805f9b34fb
06-07 12:48:41.350: V/CachedBluetoothDevice(11975): 00001106-0000-1000-8000-00805f9b34fb
06-07 12:48:41.350: V/CachedBluetoothDevice(11975): 0000110a-0000-1000-8000-00805f9b34fb
06-07 12:48:41.350: V/CachedBluetoothDevice(11975): 0000110b-0000-1000-8000-00805f9b34fb
06-07 12:48:41.350: V/CachedBluetoothDevice(11975): 0000110c-0000-1000-8000-00805f9b34fb
06-07 12:48:41.350: V/CachedBluetoothDevice(11975): 0000110e-0000-1000-8000-00805f9b34fb
06-07 12:48:41.350: V/CachedBluetoothDevice(11975): 00001112-0000-1000-8000-00805f9b34fb
06-07 12:48:41.350: V/CachedBluetoothDevice(11975): 00001115-0000-1000-8000-00805f9b34fb
06-07 12:48:41.359: V/CachedBluetoothDevice(11975): 0000111b-0000-1000-8000-00805f9b34fb
06-07 12:48:41.359: V/CachedBluetoothDevice(11975): 0000111e-0000-1000-8000-00805f9b34fb
06-07 12:48:41.359: V/CachedBluetoothDevice(11975): 0000111f-0000-1000-8000-00805f9b34fb
06-07 12:48:41.359: V/CachedBluetoothDevice(11975): 00001123-0000-1000-8000-00805f9b34fb
06-07 12:48:41.359: V/CachedBluetoothDevice(11975): 0350278f-3dca-4e62-831d-a41165ff906c
06-07 12:48:41.359: E/CachedBluetoothDevice(11975): onUuidChanged: Time since last connect67271789[ Szerkesztve ]
-
pittbaba
aktív tag
-
SektorFlop
aktív tag
jah a lényeg lemaradt egy alkalmazást szeretnék elindítani, de a következő hibaüzenetet kapom.
az első sorban a "packagename" helyet, az alkalmazás rendes package neve van, csak nem szeretném közzétenni.
Első indításra, jól működik, csak mikor "Home" gombal háttérbe pakolom aztán újra rábökök az inkonra, dob egy ilyen hibát. Ettől függetlenül elindul az alkalmazás, csak hibásan működik ezután.
Valahogyan leszeretném utánozni a gyári launcherek, hogy indítják az alkalmazást.
E/U(1382): Actlunc should be the TaskRoot
06-26 16:38:09.419: E/U(1382): at packagename.Actlunc.onResume(Actlunc.java:156)
06-26 16:38:09.419: E/U(1382): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1184)
06-26 16:38:09.419: E/U(1382): at android.app.Activity.performResume(Activity.java:5082)
06-26 16:38:09.419: E/U(1382): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2565)
06-26 16:38:09.419: E/U(1382): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2603)
06-26 16:38:09.419: E/U(1382): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2089)
06-26 16:38:09.419: E/U(1382): at android.app.ActivityThread.access$600(ActivityThread.java:130)
06-26 16:38:09.419: E/U(1382): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
06-26 16:38:09.419: E/U(1382): at android.os.Handler.dispatchMessage(Handler.java:99)
06-26 16:38:09.419: E/U(1382): at android.os.Looper.loop(Looper.java:137)
06-26 16:38:09.419: E/U(1382): at android.app.ActivityThread.main(ActivityThread.java:4745)
06-26 16:38:09.419: E/U(1382): at java.lang.reflect.Method.invokeNative(Native Method)
06-26 16:38:09.419: E/U(1382): at java.lang.reflect.Method.invoke(Method.java:511)
06-26 16:38:09.419: E/U(1382): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
06-26 16:38:09.419: E/U(1382): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
06-26 16:38:09.419: E/U(1382): at dalvik.system.NativeStart.main(Native Method)eddig ez a kód eredménye hasonlított a legjobban a gyári launcher logcat-jéhez.
Intent intentToResolve = new Intent(Intent.ACTION_MAIN);
intentToResolve.addCategory(Intent.CATEGORY_LAUNCHER);
intentToResolve.setPackage(packageName);
ResolveInfo ri = getPackageManager().resolveActivity(intentToResolve, 0);
if (ri != null)
{
Intent intent = new Intent(intentToResolve);
intent.setClassName(ri.activityInfo.applicationInfo.packageName, ri.activityInfo.name);
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(intent);
}"Amikor már azt hittem kint vagyok, ezek mindig visszarántottak..."
-
WonderCSabo
félisten
Igen, kapkodott választ adtam, fel se merült bennem, hogy db-nek így akar átadni negyedes, nem néztem meg a fv-t rendesen.
Egyébként én azt mondom, hogy vannak a db kezelésre androidon nagyon jó minták, pl. Pro Android könyvekben leírva, ha azokat használjátok fel akkor ilyen torzszülöttek nem lesznek egy bizonyos pontig. De sztem a sima androidos doksiban és van erre értelmes példakód, amit alapesetben felhasználva simán meg lehet csinálna az egyszerű db kezelő osztályt.
[ Szerkesztve ]
-
negyedes
addikt
hat ez a db nekem nem megy.... meg az android programozas se, de muszaj most megcsinaljam ebben.
kivettem a context-et de most akkor hogy a fenebe hivatkozzak a db-re mikor egy uj db objektumot hozok letre?
a db konstruktor igy nez ki:
public DatabaseHandler(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}androidos peldabol indultam ki, de nekem meg ez is magas.
Három dolog biztos az életben: az adó, a halál és az adatvesztés. - Baráth Gábor
-
negyedes
addikt
koszonom a felvilagositast, akkor marad az elso variaco az meg menni is fog.
sajnos 3 eve most latok elsore java programo kodot es raadasul android app-ot irok, lehet kicsit tulvalaltam magam. nagyon sokat felejtettem
Három dolog biztos az életben: az adó, a halál és az adatvesztés. - Baráth Gábor
-
fatal`
titán
-
trisztan94
őstag
Eszembe sem volt a View tologatás
Egy képet animálnék random pozícióra. Ezt szeretném valahogy megoldani, de libgdx-es tutorialokban szinte csak table layout-ot használnak, ami (html-es tapasztalatomból merítve) szerintem nem annyira mozgatható össze-vissza, nem?
Szval egy .java class-ből lenne kirajzolva a render metódusban mindig egy más pozícióra (az animálás ráér később, csak működjön) miután elérte a korábba kitűzött pozíciót.
:
kezdés 0,0 -> irány 20, 10
ha elérte a 20,10 -> irány 50, 30Ezek ugye mindig random vannak generálva, de érted a lényeget
https://heureka-kreativ.hu
-
negyedes
addikt
igen ez volt a hiba. koszonom, de mar is egy ujat dobott:
1: sqlite returned: error code = 1, msg = near "@yahoo": syntax error, db=/data/data/com.example.firstmail/databases/Emailapp
2: android.database.sqlite.SQLiteException: near "@yahoo": syntax error: , while compiling: SELECT DISTINCT sender, date, subject, text FROM InboxEmails WHERE sender=tesztkuldo@yahoo.com GROUP BY date=2013.07.16 16:18pm HAVING subject=Tema
Három dolog biztos az életben: az adó, a halál és az adatvesztés. - Baráth Gábor
-
WonderCSabo
félisten
Én ezt már csak azért nem javasolnám, mert a szomszéd pistika által is megírt injectiont sem védi ki. Bár ha itt ha jól látom pont nem volt user input.
(#1034) negyedes: Ha minden igaz az adapter minden egyes elemhez rendel egy View-t. Az adott sort csak akkor tudod eltüntetni, ha kiszeded a null elemeket az átadott listából.
Egy másik megoldás még az lehet, hogy csak elrejted a Viewt.public class YourAdapter extends ArrayAdapter<YourType> {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ListView listView = (ListView) parent;
if (convertView == null) {
if (getItemViewType(position) == 0) { // not null
convertView = ...; // inflate list item view
} else { // null
convertView = new View(getContext());
convertView.setVisibility(View.GONE);
}
}
if (getItem(position) == 0) { // not null
... // update data of the reused list item view
}
return convertView;
}
@Override
public int getItemViewType(int position) {
if (getItem(position) != null) { // not null
return 0;
}
return 1; // null
}
@Override
public int getViewTypeCount() {
return 2; // not null, null
}
}Nem teszteltem ki, de működnie kell.
[ Szerkesztve ]
-
-
negyedes
addikt
Nem dehogy, most atirtam normalisan es nem ker cast-ot de most sem frissiti fel a listat.
igy hasznalom:
public void onDelete(String sender, String Date, String subject) {
dbHelper.deleteOutbox(sender, Date, subject);
adapter.notifyDataSetChanged();
}[ Szerkesztve ]
Három dolog biztos az életben: az adó, a halál és az adatvesztés. - Baráth Gábor
-
WonderCSabo
félisten
Valaki járt már el hasonlóan? Vagy valami mást használt ORM-hez?
Hogy rögzítve legyen a válasz erre a kérdésre:
Kettő libet próbáltam ki. Az egyik az ActiveAndroid. Ez lightweight, egyszerű, csak 16KB, és egyszerű, letisztult API-ja van. Hátránya az, hogy customizálni szinte egyáltalán nem lehet, csak a saját magának létrehozott táblákkal képes dolgozni, és viszonylag egyszerű lekérdezésekkel, amit a query builderével lehet írni.
A másik lib az ORMLite. Ez picit bonyolultabb, és picit többet kódot kell ahhoz írni, hogy az egyszerű példákat is megcsináld. Cserébe teljesen customizálható, azt a db-t használja amit Te megadsz neki, bármilyen queryt lehet írni, és sokkal több funkciója van, mint az előzőnek. Sajnos mindennek ára van, majdnem 300KB a lib. Illetve van még egy nagy előnye is, nem csak Android SQLite backendje van, hanem MySQL, Postgres, Microsoft SQL Server, H2, Derby, HSQLDB, és sima Sqlite. Így a megírt adatbázisos kód könnyen portolható más platformra.
-
PandaMonium
őstag
Persze, hogy kell, csak nem "android módon", de még csak nem is Java-ban (nem is elérhető benne csak Javascript, C# meg mittudoménmicsoda). Én is csak ismerkedés céljából javasoltam a saját engine-t, ha határidős meló van és még nincs motor az app alá akkor nehogy most kezdj el írni hozzá. Egyébként nem olyan óriási dolog saját engine-t írni, én is épp azon vagyok (bár én desktopra, de szintén OpenGL-el és Java-val) de az tény, hogy kell hozzá kitartás és sokat kell olvasni szakmai könyveket. Akárhogy is, szerintem ha csak magának csinálja akkor ha összerak egy bármilyen alap enginet ami már képes meghajtani egy szimpla játékot abból sokkal többet tanul mint ha Unity-vel C#-ban firkál egy előre írt, agyonegyszerűsített API-ban.
What I cannot create, I do not understand
-
RexpecT
addikt
Igen ezt én is megtaláltam, de ettől még fel lehet telepíteni.
android:required:
Boolean value that indicates whether the application requires the feature specified in android:name.
When you declare "android:required="true" for a feature, you are specifying that the application cannot function, or is not designed to function, when the specified feature is not present on the device.
When you declare "android:required="false" for a feature, it means that the application prefers to use the feature if present on the device, but that it is designed to function without the specified feature, if necessary.
The default value for android:required if not declared is "true".[ Szerkesztve ]
-
SektorFlop
aktív tag
Hagyom is, nem találtam én se semmit a neten.
Viszont még egy dolog, van egy GridView, ami néha a görgetés után furán viselkedik. pl. legörgetem majd miután vissza görgetem eltűnik az egyik elem, vagy túl lehet görgetni, mintha "leszaladna" róla minden(bár elég látványosan csinálja, de még nem kellene ).
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
convertView = inflater.inflate(layout, parent, false);
}
tvAppLabel = (TextView) convertView.findViewById(R.id.tvAppName);
ivAppIcon = (ImageView) convertView.findViewById(R.id.ivAppIcon);
ivAppStatus = (ImageView) convertView.findViewById(R.id.ivAppStatus);
int id = Integer.parseInt(Ids[position]);
try{
tvAppLabel.setText(ApplicationModel.GetbyId(id).AppLabel);
if (ApplicationModel.GetbyId(id).AppSatus != null) {
if (ApplicationModel.GetbyId(id).AppSatus == true)
ivAppStatus.setBackgroundResource(R.drawable.app_disabled);
else
ivAppStatus.setBackgroundResource(R.drawable.app_enabled);
}
if (ApplicationModel.GetbyId(id).AppIcon != null) {
ivAppIcon.setImageDrawable(ApplicationModel.GetbyId(id).AppIcon);
}
}catch(Exception ex){
CatchError(ex.toString(), context);
}
return convertView;
}[ Szerkesztve ]
"Amikor már azt hittem kint vagyok, ezek mindig visszarántottak..."
-
thon73
tag
((A new line/tab átalakítást csak példának írtam, (és ebben az esetben az első pont teljesen jogos) Esetemben egy kicsit összetettebb dologról van szó: tényleges szövegfeldolgozás történik, a mentett oldalon - értelmezést könnyítendő - a rövid bejegyzéseket mintegy kibontja a program, és egy hosszú file-ban tárolja. Igazából ez is egy decoder, csak épp elég speciális. De ez a programozási probléma szempontjából lényegtelen.))
A röviden pont történt meg most (vagyis megoldást kerestem), és a választ is köszönöm: És meg is fogadom, (2. pont), mert igazad van: nem foglalkozok a teljesítménnyel. Én is gondoltam arra, hogy ha a teljesítmény ilyen fontos tényező, akkor ezt a részt natívan kellene elkészíteni, de ebben (még) nincs tapasztalatom. Egyébként nem olyan félelmetesen hosszú a feldolgozás: vmivel több, mint 200e bejegyzésre 20-40 perc jelenleg
((Arra az indiszkrét kérdésre, hogy akkor miért a telefonom csinálja, csak azt tudom mondani: az mindig nálam van. De egyébként a teljes adatbázist csak egyszer kell megcsinálni, a többi meg már rövid...))((A 3. pontban is nagy igazság van, bár egyszer beleástam magam az unicode-ba, és írtam konvertáló algoritmust is, tehát az van. Az UTF16->UTF8 irány elég egyszerű, hiszen ott (felső részek kivételével) minden karakter létezik. A fordított irány az érvénytelen szekvenciák miatt egy kicsit izgalmasabb.
A gond egyébként pont abban van, hogy az UTF8 nem egyforma hosszú részekből áll (na persze ez az előnye is), és ez - saját kód nélkül - megnehezíti a szövegfeldolgozást. A legegyszerűbb példa: nagyon nehéz effektív UTF8 beolvasást csinálni, mert nem tudod, hogy pontosan hány byte-ot kell/lehet a pufferbe olvasni, és ezért pl. vagy "görgetni" kell a puffert, vagy figyelni a végén az eltört karakterekre. Ezért is gondoltam, hogy egyfajta stream-szerű beolvasás (szerű, mert UTF8 karakterenként olvas/ír) egyszerűsíteni az életet, de még nem találtam ilyet készen. Ettől függetlenül masszívan igaz, hogy meglehetősen túlkomplikálja a programot. Bocs a hosszú okfejtésért.)) -
thon73
tag
Hátha mást is érdekel, itt a rövid logikája a próbának; egyszerűség kedvéért file helyett stringek, hibakezelés és optimalizálás nélkül. 'c' átalakítása az első ciklusba, a kiírás elé kerülhet. (ed1-ed2-ed3 egyszerűen három EditText. ed2 csak azért kódol ISO-8859-1-et, hogy lássam, hogyan is kerülnek kiírásra a byte-ok.)
Kifelejtettem a lényeget: ed1 (UTF-16 String) -> outputStream==inputStream (UTF-8 byte-array) -> ed3 (UTF-16 String). Tehát oda-vissza elvégzi az átalakítást, és nem String-gel (bár abból indul), hanem Character-folyammal dolgozik.int c;
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, "UTF-8");
StringReader stringReader = new StringReader( ed1.getText().toString() );
while ( (c=stringReader.read()) != -1 )
{
outputStreamWriter.write( c );
}
outputStreamWriter.close();
ed2.setText( outputStream.toString("ISO-8859-1") );
ByteArrayInputStream inputStream = new ByteArrayInputStream( outputStream.toByteArray() );
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
StringWriter stringWriter = new StringWriter();
while ( (c=inputStreamReader.read()) != -1 )
{
stringWriter.write( c );
}
stringWriter.close();
ed3.setText( stringWriter.toString() );Érdekes, hogy keresgélés közben StraemReader/Writer osztályokat is átfutottam, de nem ugrott be, hogy erre van szükségem. ((Hát, látszik, hogy nem a javaba "nőttem bele", ráadásul évekig nem írtam semmi komolyat. ))
A replaceEach is jó ötlet, (és ezzel visszajutottunk a túloptimalizáláshoz.) Ha legyártok egy új string-et, ami már az átalakított részeket tartalmazza, akkor áttekinthetőbbé válik a kód, ill. a fenti helyett a mentést is egy sorban meg tudom oldani. Nem nagy ár ezért az új string létrehozása, akkor sem ha több ezerszer történik meg.
Köszönöm a segítséget, az eredetitől gyökeresen eltérő logikájú kód született, de sokkal szebb, és jobb. Nem végeztem még méréseket, de nem tűnik nagyságrendekkel lassúbnak. (Gondolom, az SD kártya sebessége lesz a meghatározó...)
[ Szerkesztve ]
-
thon73
tag
Hadd folytassam még az elmélkedést:
Mi a helyzet a RandomAccessFile() eléréssel? Ott nem tudok stream-et használni, vagy nem tudok ugrálni a file-ban.
Vegyünk egy egyszerű példát: sd-kártyára mentett, UTF-8 kódolású, de igen hosszú szöveg egy részét szeretném beolvasni, és a képernyőre írni. (Vagyis egy egyszerű olvasóprogram.) Korábbi olvasásból tudom, hogy hol vannak a bekezdéshatárok, így a feldolgozást tudom a szöveg "közepén" kezdeni.Ha az előző logikát követem, akkor kell készítenem egy saját byte-stream-et, mely a bemenetét a raf.read()-ből veszi, és azt az előző módon adja a konverternek. Ennek az az előnye, hogy minden, android által ismert dekódolást elvégeztethetek.
Vagy - ha biztos vagyok abban, hogy csak BasicMultilingualPlane-t használó Utf8 szövegem van - mégiscsak egyszerűbb magát a decoder-t megírni. Az pont a szükséges byte mennyiséget olvassa ki a forrásszövegből, és karakterenként visszaadja.
Vagy (ezt még nem csináltam): beolvasok egy buffernyi byte-ot, majd valamekkora részt feldolgozok belőle. A végén szinte biztosan egy félbevágott karakter lesz. Átpozícionálom a beolvasást a feldolgozott rész végére, és megyek tovább. Vagy a levágott részeket beteszem a puffer elejére, és onnét folytatom az olvasást.
Mindegyik esetben egy jelentős saját részt kell alkotni, holott egy igen triviális feladatról van szó. Ezt meg tudom kerülni valahogy szabványos rutinokkal?
Ill. a fenti megközelítések közül melyik lenne szerintetek a legeffektívebb/legegyszerűbb??((Az előzőekben egy backup-ként szereplő exportról beszéltünk, ahol a stream kiváló megoldás, mert nem kell benne ugrálni. Az utóbbi egy korábbi probléma, ahol nem ez a helyzet. De kíváncsi lennék a véleményetekre.))
[ Szerkesztve ]
-
lordjancso
senior tag
Hmm.. Ez jónak tűnik, köszönöm szépen!
"Bár én biztosan WeakReference-et raknék el a View-hoz."
Ezt hogy érted? Kezdő Android fejlesztő vagyok, úgyhogy kifejtenéd ezt nekem bővebben? Köszi!Rip and cut and mutilate the innocent, his friends, and again and again and on and on.
Új hozzászólás Aktív témák
- Asus ROG Phone 6 - Limited Batman Edition / BONTATLAN - 3 év gari
- Huawei Matebook D14 i5-11.gen/16GB DDR4/512GB PCIe SSD/14" Full HD IPS/Gar.:2025.10
- Rog 4070 Ti //KERESEM!!//
- Binepad BN006, programozható, mechanikus macropad, low profile Kailh Choc v1 Red switchek
- CoolerMaster ControlPad, programozható, mechanikus macropad, Gateron Red switchek