我正在尝试在以下代码中运行一个线程,但它因某种未知原因而崩溃。 这是代码 - >
public class StaticRef extends Activity implements Runnable
{
Cursor cursor;
Thread tSearchSongs=new Thread(this,"SearchSongs");
WritingXML wxml;
public void searchforsongs()
{
tSearchSongs.start();
}
@Override
public void run()
{
Looper.prepare();
try
{
wxml=new WritingXML();
String[] STAR = { "*" };
Uri allsongsuri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";
cursor = managedQuery(allsongsuri, STAR, selection, null, null);
if (cursor != null)
{
if (cursor.moveToFirst())
{
do
{
//SongName
String song_name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));
//SongID
int song_id = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media._ID));
//SongPath
String fullpath = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
//Song's album name
String album_name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));
//Song's album ID
int album_id = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));
//Song's artist name
String artist_name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
//Song's artist ID
int artist_id = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST_ID));
try
{
wxml.AddDatatoXML(Integer.toString(song_id) , song_name, fullpath);
}
catch(Exception exp)
{
Log.e("~~Exception Occurred in StaticRef~~", exp.toString());
}
} while (cursor.moveToNext());
}
cursor.close();
}
}
catch(NullPointerException exp)
{
Log.e("~~Null Pointer Exception~~",exp.toString());
android.util.Log.e("->>" , "~~stacktrace~~", exp);
}
catch(Exception exp)
{
Log.e("~~Exception~~",exp.toString());
}
}
}
以下是其LOGCAT
08-29 13:54:03.149: E/~~Null Pointer Exception~~(13899): java.lang.NullPointerException
08-29 13:54:03.159: E/->>(13899): ~~stacktrace~~
08-29 13:54:03.159: E/->>(13899): java.lang.NullPointerException
08-29 13:54:03.159: E/->>(13899): at android.content.ContextWrapper.getContentResolver(ContextWrapper.java:91)
08-29 13:54:03.159: E/->>(13899): at android.app.Activity.managedQuery(Activity.java:1708)
08-29 13:54:03.159: E/->>(13899): at com.example.boombastic.StaticRef.run(StaticRef.java:53)
08-29 13:54:03.159: E/->>(13899): at java.lang.Thread.run(Thread.java:856)
我还想知道什么是looper及其在线程执行中的重要意义?
答案 0 :(得分:2)
如果在活动的onCreate()之前调用managedQuery()
方法,则该方法将没有有效的上下文。有关详细信息,请参阅此问题:why does getContentResolver() within Application cause NullPointerException?
答案 1 :(得分:0)
Looper是用于运行消息循环的线程。默认情况下,线程没有消息,因此您必须自己实现它们。
关于NPE,请查看allprog的答案。