【问题标题】:Android Splash screen Firebase synchronizationAndroid 启动画面 Firebase 同步
【发布时间】:2017-12-31 16:05:39
【问题描述】:

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

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

但是当我启动应用程序时,我在日志中看到启动屏幕后与 firebase 的同步继续,并且当 mainActivity 启动时数据不在区域设置数据库中。 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();
    }

【问题讨论】:

    标签: android firebase firebase-realtime-database splash-screen firebase-storage


    【解决方案1】:

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

    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");
    
        }
    

    【讨论】:

    • 但我下载了很多声音,所以我在 For 中进行下载,所以我无法将代码从 onPost 移动到 onSuccess
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 2021-12-26
    • 1970-01-01
    • 2015-06-21
    • 2020-06-15
    • 2020-12-14
    • 1970-01-01
    相关资源
    最近更新 更多