Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Android 在收到完成通知的同时,如何异步调用MediaScannerConnection.scanFile()?_Android_Multithreading_Android Activity_Android Mediascanner - Fatal编程技术网

Android 在收到完成通知的同时,如何异步调用MediaScannerConnection.scanFile()?

Android 在收到完成通知的同时,如何异步调用MediaScannerConnection.scanFile()?,android,multithreading,android-activity,android-mediascanner,Android,Multithreading,Android Activity,Android Mediascanner,我想从MediaStore收集一些信息。有时.nomedia文件导致文件未被扫描,因此我使用显式调用来确保文件已被扫描 所以我打电话来 MediaScannerConnection.scanFile(Context activity, String[] path, String[] mimeTypes, OnScanCompletedListener oscl); …强制扫描。但是,这可能需要一段时间,所以我想在后台运行它 为了实现这一点,我遇到了几个问题: 首先,我尝试从一个新线程

我想从MediaStore收集一些信息。有时.nomedia文件导致文件未被扫描,因此我使用显式调用来确保文件已被扫描

所以我打电话来

MediaScannerConnection.scanFile(Context activity, String[] path, 
   String[] mimeTypes, OnScanCompletedListener oscl);
…强制扫描。但是,这可能需要一段时间,所以我想在后台运行它

为了实现这一点,我遇到了几个问题:

  • 首先,我尝试从一个新线程调用MediaScannerConnection,但这不起作用,因为扫描程序最早是在活动结束后启动的。我认为“上下文活动”参数将导致在结束此活动后启动

  • 其次,在另一个线程中等待结果并不总是可以的,因为这取决于结果如何继续

因此,这两种方法都不起作用-(

所以我的问题是:如何启动
MediaScannerConnection.scanFile()
在活动线程以外的线程中?如果不可能,那么实现异步处理的最佳实践是什么?嗯,等待必须在新线程中进行,但是现在使用结果来决定如何继续已经太晚了


第一次尝试的示例-从不返回结果: 第二次尝试的示例: 提前感谢所有有好主意解决这个问题的人!

我用这个

public class MediaLibraryHelper {
    public interface OnMediaScanListener{
        void onError();
        void onSuccess(Uri uri);
    }

    private MediaScannerConnection conn;
    private Context context;
    public MediaLibraryHelper(Context context){
        this.context=context;
    }

    public void scanFile(final File file,final OnMediaScanListener lis){
        if(conn!=null)
            conn.disconnect();

        if(!file.isFile()){
            lis.onError();
            return;
        }

        conn=new MediaScannerConnection(context,new MediaScannerConnectionClient(){


            public void onMediaScannerConnected() {
                conn.scanFile(file.getAbsolutePath(),null);
            }


            public void onScanCompleted(String arg0, Uri arg1) {
                conn.disconnect();
                if(arg1==null){
                    lis.onError();
                }
                lis.onSuccess(arg1);

            }});
        conn.connect();
    }


}

签名已删除,请参阅@Sameera:Please read上的常见问题解答-简而言之,不要为诸如签名之类的琐事费心编辑,除非你还需要花时间解决更严重的问题,如标题、语法和格式(请参阅Grillz和我的编辑,以了解这篇文章需要多少额外编辑)。当一个长问题的其余部分很难阅读时,当标题不清楚时,删除签名是毫无意义的。此外,如果你要留下评论,请谨慎行事。@Shog9谢谢Shog,我会记住的。
Log.d(TAG, "MAIN: ID of the main thread ... " 
      + Thread.currentThread().getId());
final Object o = new Object();

// call scanner ...
Log.d(TAG, "scanning of file started ...");
MediaScannerConnection.scanFile(ActivityPlayer.this, 
        new String[] {mp3File.getAbsolutePath() }, 
        null,   
        new MediaScannerConnection.OnScanCompletedListener() {
          @Override
          public void onScanCompleted(String path, Uri uri) {
            Log.d(TAG, "the onScanCompleted is called! (" + path + ")");
            synchronized (o) {
              o.notifyAll();
              Log.d(TAG, "notify is successful executed!");
            }
          }
        });
// Start thread for waiting ...
Thread waiterThread = new Thread() {
  public void run() {
    Log.d(TAG, "WAITER: waiter thread is started!");
    synchronized (o) {
      try {
        Log.d(TAG, 
              "WAITER: Start: Waiting - for the notify of this object o!");
        o.wait();
        Log.d(TAG, "WAITER: End: Waiting - the notify happened!");
      } catch (Exception e) { // InterruptedException
        e.printStackTrace();
      }
    }
  }
};
waiterThread.start();
Log.d(TAG, "MAIN: ended things ... ");
public class MediaLibraryHelper {
    public interface OnMediaScanListener{
        void onError();
        void onSuccess(Uri uri);
    }

    private MediaScannerConnection conn;
    private Context context;
    public MediaLibraryHelper(Context context){
        this.context=context;
    }

    public void scanFile(final File file,final OnMediaScanListener lis){
        if(conn!=null)
            conn.disconnect();

        if(!file.isFile()){
            lis.onError();
            return;
        }

        conn=new MediaScannerConnection(context,new MediaScannerConnectionClient(){


            public void onMediaScannerConnected() {
                conn.scanFile(file.getAbsolutePath(),null);
            }


            public void onScanCompleted(String arg0, Uri arg1) {
                conn.disconnect();
                if(arg1==null){
                    lis.onError();
                }
                lis.onSuccess(arg1);

            }});
        conn.connect();
    }


}