簡體   English   中英

當活動被破壞時,Android Firebase 存儲繼續上傳

[英]Android Firebase Storage Keep Uploading When Activity Is Destroyed

當有人使用我的 android 應用程序將視頻上​​傳到 Firebase 存儲時,我希望即使活動被破壞也能上傳視頻。 我嘗試使用 asynctask,但它似乎不起作用。 這是異步任務代碼:

public class UploadAttachment extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... params) {
        userRef.child("currentSeason").addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                if (dataSnapshot.exists()) {

                    final String attachCurrentSeason = dataSnapshot.getValue().toString();

                    seasonRef.child("id").addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {

                            String path = "users/" + mAuth.getUid() + "/" + attachCurrentSeason + "/game" + String.valueOf(Integer.parseInt(dataSnapshot.getValue().toString()) - 1);
                            StorageReference storageReference = storage.getReference(path);

                            storageReference.putBytes(byteArray);

                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });

                }

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
        return null;
    }
}

我讀過很多東西說當活動被銷毀時 Asynctask 仍然會運行,但它對我不起作用。 不允許在 asynctask 中使用 firebase 嗎?

任何幫助表示贊賞。 提前致謝!

由於視頻發送量很大,我建議您使用后台服務,您可以在官方 Android 文檔中找到相關信息。

你可以這樣創建:(最好定義一個單獨的 UploadVideoService.java 類)

public class UploadVideoService extends IntentService {
    public UploadVideoService() {
        super("UploadVideoService");
    }

    @Override
    protected void onHandleIntent(Intent workIntent) {
        String path = workIntent.getStringExtra("path");
        StorageReference storageReference = storage.getReference(path);
        storageReference.putBytes(workIntent.getByteArrayExtra("data"));
    }
}

在您的 Activity 中,啟動將所有數據傳遞給它的服務:

//...
userRef.child("currentSeason").addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()) {
            final String attachCurrentSeason = dataSnapshot.getValue().toString();
            seasonRef.child("id").addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    String path = "users/" + mAuth.getUid() + "/" + attachCurrentSeason + "/game" + String.valueOf(Integer.parseInt(dataSnapshot.getValue().toString()) - 1);

                    // here you call the service, replace Activity with your Activity name
                    Intent mServiceIntent = new Intent(Activity.this, UploadVideoService.class);
                    mServiceIntent.putExtra("path", path);
                    mServiceIntent.putExtra("data", byteArray);
                    startService(mServiceIntent);

                }
                @Override
                public void onCancelled(DatabaseError databaseError) {}
            });
        }
    }
    @Override
    public void onCancelled(DatabaseError databaseError) {}
});
//...

您還必須在清單中定義服務,如下所示:

<service android:name=".UploadVideoService" android:exported="false"/>

例如,上傳完成后,您可以在通知欄中放置通知以告訴用戶作業已完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM