Path: csiph.com!x330-a1.tempe.blueboxinc.net!usenet.pasdenom.info!news.albasani.net!news2.arglkargh.de!news.musoftware.de!wum.musoftware.de!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: Dirk Bruere at NeoPax Newsgroups: comp.lang.java.programmer Subject: Re: Threads and UI in Android Date: Mon, 04 Apr 2011 23:41:52 +0100 Organization: Dirk Bruere at Neopax Lines: 73 Message-ID: <8vuvpbFrt9U1@mid.individual.net> References: <8vrrsdF6urU1@mid.individual.net> <8vs005F5tmU1@mid.individual.net> <8vt2tjFcvhU1@mid.individual.net> <8vugc0F6boU1@mid.individual.net> Reply-To: dirk.bruere@gmail.com Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Trace: individual.net b33f1aEy4r76XROqefYnqwES8GKwb7oBhUPOKGe89df8IYwQZd Cancel-Lock: sha1:F1MzYTX+BF8lhkr666kXplqDd40= User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.15) Gecko/20110303 Thunderbird/3.1.9 In-Reply-To: Xref: x330-a1.tempe.blueboxinc.net comp.lang.java.programmer:2856 On 04/04/2011 22:54, markspace wrote: > On 4/4/2011 11:18 AM, Dirk Bruere at NeoPax wrote: > >> Or not. >> That BlinkAPI.updateIncomingData(packetStr) eventually gets to call this >> from the Data class >> >> public static void setRadioTitleAdapterListView() >> { > > > I don't like the idea that you're suggesting here. Hard baking this > method so it always runs on the UI thread sounds bad. You want to keep > methods flexible so they can be used in a variety of contexts. Too much > specialized behavior results in classes that require too many support > classes or a specialized environment to function at all. > > Better to do it where you had it at first. You're already processing the > packet and making a string. It seems fine to allow your Blink routine to > process the resulting string on the UI thread. You don't have to be > manic about removing every last cycle from the UI thread, just keep long > tasks (like IO, or sorting or searching) away from it. > > Also, in the code you posted, you set up packetStr once outside of the > loop, then never use that value, so I'm moving packetStr inside the loop > and removing the unused assignment. > > And I think you mean !packetStr.equals( "" ), not packetStr != null. It > isn't possible to get null from a constructor. > > > public void run() > { > try > { > DatagramSocket ds = new DatagramSocket(Constants.LOCAL_PORT); > DatagramPacket incoming = new DatagramPacket( > receiveBuffer, receiveBuffer.length); > incoming.setLength(length); > // not used String packetStr=new String(receiveBuffer, "UTF-8"); > > while(true) //Run this as an endless loop > { > ds.setReceiveBufferSize(receiveBuffer.length); > ds.receive(incoming); > final String packetStr = new String(receiveBuffer, 0, > incoming.getLength(), "UTF-8"); > if( !packetStr.equals( "" ) ) { > Activity.runOnUiThread( new Runnable() { > public void run() { > BlinkAPI.updateIncomingData(packetStr); > } > } ); > } > } catch (IOException e1) { > // you really must log errors if you find them > // honestly, you'll be happy you did. > } > } > } > > At least we're doing things now that look like actual Java programming. :-) BTW, do you any kind of feel for how long it would take to load a ListView (and adapter/array) with (say) 1000 items comprising about 100kB of data? -- Dirk http://www.neopax.com/technomage/ - My new book - Magick and Technology