Android Splash screen Firebase synchronization



我已经为我的安卓应用程序创建了一个启动画面,

在此活动中,我需要从Firebase存储中下载一些声音,并将我的本地数据库与Firebase实时数据库同步。

但是当我启动应用程序时,我在日志中看到与 Firebase 的同步在启动画面后继续,并且在启动 mainActivity 时数据不在区域设置数据库中。在火力基地同步完成后,谁来启动主活动。

我的代码 :

public class SplashScreen extends Activity {
// Splash screen timer
private static int SPLASH_TIME_OUT = 3000;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);
    File folder = new File(Environment.getExternalStorageDirectory() + "/"+getString(R.string.folder_name));
    if(!folder.exists()) {
        folder.mkdir();
    }
    new DataSyncFb(this).execute();
}

public class DataSyncFb extends AsyncTask<Void, Integer, Void> {

    private Context context;
    private StorageReference mStorageRef;

    public DataSyncFb(final Context context) {
        this.context = context;
    }
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        Log.i("DataSincFB", "onPreExecute");
    }

    @Override
    protected Void doInBackground(Void... voids) {
        final DatabaseHandler db = new DatabaseHandler(context);
        final FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference dbRef = database.getReference("categorie");
        dbRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                try {
                    List<String> listCat = db.getAllCategoriesId();
                    List<String> listSounds = db.getAllSoundsId();
                    Log.i("test", String.valueOf(dataSnapshot.getValue()));
                    Gson test = new Gson();
                    JSONArray jsonArray = new JSONArray(test.toJson(dataSnapshot.getValue()));
                    for (int i = 0; i < jsonArray.length(); i++){
                        JSONObject cat = jsonArray.getJSONObject(i);
                        String nom = cat.getString("nom");
                        String id = cat.getString("id");
                        if (!listCat.contains(id)) {
                            db.addCategorie(nom, id);
                        }
                        JSONArray sounds = cat.getJSONArray("son");
                        Log.i("cat", sounds.toString());
                        for (int j = 0; j < sounds.length(); j++){
                            JSONObject sound = sounds.getJSONObject(j);
                            String soundId = sound.getString("id");
                            if (!listSounds.contains(soundId)){
                                //downloadFile(sound.getString("lien"));

                                FirebaseStorage storage = FirebaseStorage.getInstance();
                                StorageReference storageRef = storage.getReferenceFromUrl("gs://soundbox-a6dd8.appspot.com");
                                StorageReference  islandRef = storageRef.child(sound.getString("lien")+".mp3");
                                File rootPath = new File(Environment.getExternalStorageDirectory(), context.getString(R.string.folder_name));
                                if(!rootPath.exists()) {
                                    rootPath.mkdirs();
                                }
                                final File localFile = new File(rootPath,sound.getString("lien")+".mp3");
                                islandRef.getFile(localFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
                                    @Override
                                    public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
                                        Log.e("firebase ",";local tem file created  created " +localFile.toString());
                                        //  updateDb(timestamp,localFile.toString(),position);
                                    }
                                }).addOnFailureListener(new OnFailureListener() {
                                    @Override
                                    public void onFailure(@NonNull Exception exception) {
                                        Log.e("firebase ",";local tem file not created  created " +exception.toString());
                                    }
                                });
                                db.addSound(soundId, sound.getString("nom"), sound.getString("lien") ,id);
                            }
                        }
                    }
                    Log.i("sound", String.valueOf(db.getAllSound()));
                    Log.i("Firebase", jsonArray.toString());
                    Log.i("Firebase", String.valueOf(db.getAllCategories()));
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
            @Override
            public void onCancelled(DatabaseError databaseError) {
            }
        });
        return null;
    }
    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        Log.i("DataSyncFB", "onPostExecute");
        Intent i = new Intent(SplashScreen.this, MainActivity.class);
        startActivity(i);
        // close this activity
        finish();
    }

我认为您应该需要自定义回调才能在所有下载任务完成后触发异步任务。下面是修改后的代码:

public class SplashScreen extends Activity {
// Splash screen timer
private static int SPLASH_TIME_OUT = 3000;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);
    File folder = new File(Environment.getExternalStorageDirectory() + "/"+getString(R.string.folder_name));
    if(!folder.exists()) {
        folder.mkdir();
    }
    new DataSyncFb(this, new DataSyncFb.OnTaskFinishedCallback(
        @Override
        public void onTaskFinished() {
            Intent i = new Intent(SplashScreen.this, MainActivity.class);
            startActivity(i);
            // close this activity
            finish();
        }
    )).execute();
}

public class DataSyncFb extends AsyncTask<Void, Integer, Void> {
    // Custom callback
    public interface OnTaskFinishedCallback {
        public void onTaskFinished();
    }
    private Context context;
    private StorageReference mStorageRef;
    private OnTaskFinishedCallback callback;

    public DataSyncFb(final Context context, OnTaskFinishedCallback callback) {
        this.context = context;
        this.callback = callback;
    }
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        Log.i("DataSincFB", "onPreExecute");
    }

    @Override
    protected Void doInBackground(Void... voids) {
        final DatabaseHandler db = new DatabaseHandler(context);
        final FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference dbRef = database.getReference("categorie");
        dbRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                try {
                    List<String> listCat = db.getAllCategoriesId();
                    List<String> listSounds = db.getAllSoundsId();
                    Log.i("test", String.valueOf(dataSnapshot.getValue()));
                    Gson test = new Gson();
                    JSONArray jsonArray = new JSONArray(test.toJson(dataSnapshot.getValue()));
                    int totalDownloadCounter = 0;
                    int downloadCounter = 0;
                    // Determine how much files you should download first
                    for (int i = 0; i < jsonArray.length(); i++) {
                        JSONObject cat = jsonArray.getJSONObject(i);
                        JSONArray sounds = cat.getJSONArray("son");
                        for (int j = 0; j < sounds.length(); j++){
                            String soundId = sound.getString("id");
                            if (!listSounds.contains(soundId)) {
                                totalDownloadCounter++;
                            }
                        }
                    }
                    for (int i = 0; i < jsonArray.length(); i++){
                        JSONObject cat = jsonArray.getJSONObject(i);
                        String nom = cat.getString("nom");
                        String id = cat.getString("id");
                        if (!listCat.contains(id)) {
                            db.addCategorie(nom, id);
                        }
                        JSONArray sounds = cat.getJSONArray("son");
                        Log.i("cat", sounds.toString());
                        for (int j = 0; j < sounds.length(); j++){
                            JSONObject sound = sounds.getJSONObject(j);
                            String soundId = sound.getString("id");
                            if (!listSounds.contains(soundId)){
                                //downloadFile(sound.getString("lien"));
                                FirebaseStorage storage = FirebaseStorage.getInstance();
                                StorageReference storageRef = storage.getReferenceFromUrl("gs://soundbox-a6dd8.appspot.com");
                                StorageReference  islandRef = storageRef.child(sound.getString("lien")+".mp3");
                                File rootPath = new File(Environment.getExternalStorageDirectory(), context.getString(R.string.folder_name));
                                if(!rootPath.exists()) {
                                    rootPath.mkdirs();
                                }
                                final File localFile = new File(rootPath,sound.getString("lien")+".mp3");
                                islandRef.getFile(localFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
                                    @Override
                                    public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
                                        Log.e("firebase ",";local tem file created  created " +localFile.toString());
                                        downloadCounter++;
                                        //  updateDb(timestamp,localFile.toString(),position);
                                        if (downloadCounter == totalDownloadCounter) {
                                            callback.onTaskFinished();
                                        }
                                    }
                                }).addOnFailureListener(new OnFailureListener() {
                                    @Override
                                    public void onFailure(@NonNull Exception exception) {
                                        Log.e("firebase ",";local tem file not created  created " +exception.toString());
                                        downloadCounter++;
                                        if (downloadCounter == totalDownloadCounter) {
                                            callback.onTaskFinished();
                                        }
                                    }
                                });
                                db.addSound(soundId, sound.getString("nom"), sound.getString("lien") ,id);
                            }
                        }
                    }
                    Log.i("sound", String.valueOf(db.getAllSound()));
                    Log.i("Firebase", jsonArray.toString());
                    Log.i("Firebase", String.valueOf(db.getAllCategories()));
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
            @Override
            public void onCancelled(DatabaseError databaseError) {
            }
        });
        return null;
    }
    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        Log.i("DataSyncFB", "onPostExecute");
    }

最新更新