1

次のコードでスレッドを実行しようとしていますが、不明な理由でクラッシュしています。これはコードです - >

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)

また、ルーパーとは何か、スレッド実行におけるその重要性も知りたいですか?

4

2 に答える 2

2

managedQuery()アクティビティの onCreate() の前にメソッドを呼び出すと、メソッドには有効なコンテキストがありません。詳細については、この質問を参照してください:アプリケーション内の getContentResolver() が NullPointerException を引き起こすのはなぜですか?

于 2013-08-29T08:47:18.203 に答える
0

Looper は、メッセージ ループを実行するために使用されるスレッドです。スレッドにはデフォルトでメッセージがないため、自分で実装する必要があります。

NPE については、allprog の回答をご覧ください。

于 2013-08-29T08:54:41.223 に答える