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