I wasn't able to get the AsyncTask to work (although I have used it successfully in another app). What I did was use the Looper.prepare(); in my run() method:
public void run(){ Looper.prepare(); loadsongs(CURRENT_PLAYLIST); mHandler = new Handler() { @Override public void handleMessage(Message msg){ // refresh the listing of playlists } }; Looper.loop(); } It doesn't crash, but it doesn't show the refresh of the listview either -- but I think the listview is being refreshed. I have to leave the activity and return to it to see the update. On Feb 18, 10:43 am, Frank Weiss <fewe...@gmail.com> wrote: > Use AsyncTask instead od Java threads. I'm not kidding, it's that simple. > > > > On Thu, Feb 18, 2010 at 10:21 AM, Ken H <hunt1...@gmail.com> wrote: > > What am I doing wrong here? I have a listview of items (songs on the > > sd card). The user has an option to load all the songs on the sd card > > to into a current playlist -- those songs are what is displayed in the > > listview. Because this can take few seconds to load if they have a lot > > of songs on the card, I want to display a progress dialog to just tell > > the user "One moment..." until the list refresh is done. > > > I launch a thread to do this. I've done this successfully on another > > app I have (which just updates a database in the background but > > doesn't update any display), but this one fails with this error > > message, "Can't create handler inside thread that has not called > > Looper.prepare()". I chopped down the activity and pasted it below. > > What am I doing wrong here? I have just a vague idea of what might be > > happening. > > > By the way, everything works when I take out the threaded stuff, it > > just looks like the app freezes for a couple seconds. > > > Ken > > > / > > > *************************************************************************** > > *********************/ > > > public class ListingThing extends ListActivity implements Runnable { > > public static final String PREF_NAME = "PlaylistAlarmPreferences"; > > static final private int CONFIGURE_PLAYLIST = Menu.FIRST; > > static final private int DELETE_LIST = Menu.FIRST+1; > > static final private int DELETE_SONG = Menu.FIRST; > > static final private int LOAD_ALL = Menu.FIRST+2; > > String playlistName, CURRENT_PLAYLIST; > > SharedPreferences settings; > > String[] items, subitems, fullpath; > > int DRILL_DOWN_LEVEL, resultCount; > > MediaPlayer mMediaPlayer; > > ProgressDialog myProgressDialog; > > > /** Called when the activity is first created. */ > > �...@override > > public void onCreate(Bundle savedInstanceState) { > > super.onCreate(savedInstanceState); > > > mMediaPlayer = new MediaPlayer(); > > > getListOfPlaylists(); > > setListAdapter(new MySpecialAdapter(this)); > > // you need this for the contextmenu > > registerForContextMenu(getListView()); > > } > > > public void getListOfPlaylists(){ > > // query db for list of songs > > } > > > class MySpecialAdapter extends ArrayAdapter { > > Activity context; > > > MySpecialAdapter(Activity context) { > > super(context, R.layout.double_list_item, items); > > this.context=context; > > } > > > public View getView(int position, View convertView, ViewGroup > > parent) { > > View row=convertView; > > > if (row==null) { > > LayoutInflater inflater=context.getLayoutInflater(); > > row=inflater.inflate(R.layout.double_list_item, > > null); > > } > > > TextView text1 = (TextView)row.findViewById(R.id.maintext); > > text1.setText(items[position]); > > TextView text2 = (TextView)row.findViewById(R.id.subtext); > > text2.setText(subitems[position]); > > row.setSoundEffectsEnabled(true); > > > return row; > > } > > } > > > // This handles a context menu item click > > �...@override > > public boolean onContextItemSelected(MenuItem item) { > > AdapterContextMenuInfo info = (AdapterContextMenuInfo) > > item.getMenuInfo(); > > Object n = this.getListAdapter().getItemId((int)info.id); > > final String pos = n.toString(); // get the item number of > > selection > > > myProgressDialog = ProgressDialog.show(this, > > "One moment...", "Refreshing list of songs in > > playlist.", true); > > CURRENT_PLAYLIST = items[Integer.parseInt(pos)]; > > Thread t = new Thread(this); > > t.start(); > > > return super.onContextItemSelected(item); > > } > > > public void run(){ > > loadsongs(CURRENT_PLAYLIST); > > handler.sendEmptyMessage(0); > > } > > > private Handler handler = new Handler() { > > �...@override > > public void handleMessage(Message msg){ > > myProgressDialog.dismiss(); > > // refresh the listing of playlists > > getListOfPlaylists(); > > setListAdapter(new MySpecialAdapter(ListingThing.this)); > > > } > > }; > > > // delete all songs in playlist and then reload all songs into it > > private void loadsongs(String pl){ > > try{ > > Uri media = > > MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; > > DBAdapter db_songs = new > > DBAdapter(ListingThing.this); > > > String[] projection = { > > // The columns we want > > MediaStore.Audio.Media._ID, > > // 0 > > MediaStore.Audio.Media.ARTIST, > > // 1 artist > > MediaStore.Audio.Media.TITLE, > > // 2 song > > MediaStore.Audio.Media.DATA, > > // 3 full path of file "/sdcard/In > > Da Club.mp3" > > MediaStore.Audio.Media.DISPLAY_NAME, // 4 > > "In Da Club.mp3" > > MediaStore.Audio.Media.DURATION}; > > // 5 time in milliseconds > > > String selection = MediaStore.Audio.Media.IS_MUSIC + > > " != 0"; > > Cursor c = this.managedQuery(media, projection, > > selection, null, > > null); > > > db_songs.open(); > > db_songs.deletePlaylist(pl); // delete all songs > > in playlist first > > if (c.moveToFirst()){ > > do { > > db_songs.insertPoint( > > pl, > > c.getString(1), > > c.getString(2), > > c.getString(3), > > c.getString(4), > > c.getString(5), > > 0); > > }while (c.moveToNext()); > > } > > resultCount = c.getCount(); > > db_songs.close(); > > c.close(); > > Toast.makeText(ListingThing.this, > > "All songs on the SD card where > > added to the playlist > > '"+playlistName+"'", > > Toast.LENGTH_LONG).show(); > > > }catch(Exception e){ > > Toast.makeText(ListingThing.this, > > "Error loading all songs to playlist.\n: > > "+e, > > Toast.LENGTH_LONG).show(); > > } > > > } > > } > > > -- > > You received this message because you are subscribed to the Google > > Groups "Android Developers" group. > > To post to this group, send email to android-developers@googlegroups.com > > To unsubscribe from this group, send email to > > android-developers+unsubscr...@googlegroups.com<android-developers%2Bunsubs > > cr...@googlegroups.com> > > For more options, visit this group at > >http://groups.google.com/group/android-developers?hl=en -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en