Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在线程中获取上下文或缩短进程?_Java_Android_Multithreading_File - Fatal编程技术网

Java 如何在线程中获取上下文或缩短进程?

Java 如何在线程中获取上下文或缩短进程?,java,android,multithreading,file,Java,Android,Multithreading,File,我制作了一个媒体播放器,我想在ArrayList中加载mp3文件。我在一个名为get getMP3Files的方法中实现了这一点。这需要相当长的时间。所以我想换一条线。但是我没有在run()中获取上下文和方法 是否有可能缩短这一过程,或在其中获得背景 提前谢谢 GetMP3文件: private void getMP3Files(Context context, String directory,ArrayList<MusicListArray> mp3_list){ Me

我制作了一个媒体播放器,我想在ArrayList中加载mp3文件。我在一个名为get getMP3Files的方法中实现了这一点。这需要相当长的时间。所以我想换一条线。但是我没有在run()中获取上下文和方法

是否有可能缩短这一过程,或在其中获得背景

提前谢谢

GetMP3文件:

private void getMP3Files(Context context, String directory,ArrayList<MusicListArray> mp3_list){

    MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
    Uri uri;
    byte[] album_art;
    Bitmap bitmap;
    /*File[] files = Directory.listFiles(new MP3FileNameFilter());
    files = Directory.listFiles();*/

    File folder = new File(directory);
    for (File file : folder.listFiles()) {
        if (file.isFile()) {
            if (file.getName().endsWith(".mp3") || file.getName().endsWith(".MP3")) {
                uri = Uri.fromFile(file);
                mediaMetadataRetriever.setDataSource(context,uri);
                String artist = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
                String title = file.getName();
                album_art = mediaMetadataRetriever.getEmbeddedPicture();
                if(album_art != null){
                    bitmap = BitmapFactory.decodeByteArray(album_art, 0, album_art.length);
                }else{
                    bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.ic_launcher);
                }
                if(bitmap == null){
                    bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.ic_launcher);
                }
                if (title.indexOf(".") > 0)
                    title = title.substring(0, title.lastIndexOf("."));
                if(artist == null){
                    artist = getString(R.string.unknown_artist);
                }

                mp3_list.add(new MusicListArray(title,artist,file,bitmap));
            }
        }else if(file.isDirectory()){
            getMP3Files(context, file.getPath(), mp3_list);
        }
    }
    Collections.sort(mp3_list);

    /*for(int i=0;i<files.length;i++){
        mp3_list.add(new MusicListArray(files[i].getName(),"Test",files[i]));
    }*/
    //return mp3_list;
}

您不应该尝试在非UI线程中更新UI。应仅在UI线程中更新UI。使用以下适合您的方法之一将UI更新调用推送到UI线程:

Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)

在您的情况下,您可以避免线程的复杂性,并使用
AsyncTask
。它专门用于在后台执行耗时的任务。

在活动或其他类中,您的方法运行在哪里?方法run()在活动中是内部的?在这种情况下,您可以使用MYActivity。此
run()
getmp3文件
位于MainActivity中@phemt.latd不起作用。:/你知道如何缩短文件搜索时间,这样我就不需要线程了吗?我怀疑你有不同的问题。请在日志中注明错误。
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)