2013-01-06 51 views
1

對不起,這是一個有點複雜的標題,我會試着用我自己的詞來表達我到底在想什麼。關於文件uplaoding列表和服務/活動的設計模式

  1. 我有一個ListActivity讓用戶挑選的照片(S)被上傳
  2. 上傳,我會把照片名爲PhotoList
  3. 後靜態的ArrayList裏面,我將開始服務上傳這些照片
  4. 現在,用戶可以切換到其他活動來做其他事情
  5. 稍後,用戶將返回到此ListActivity以檢查上傳狀態。在這裏他們也可以選擇更多照片上傳。

所以,我的PhotoList實際上是一種Queue,但它也是一個要在ListActivity上顯示的數據。

我的問題是,當服務正在運行,並且用戶選擇了更多照片時,我想將這些照片放入PhotoList中。 (我不想再次啓動服務,因爲該服務已經在運行...)

現在我只是深陷其中,請給我一些建議,謝謝〜

(對不起再次爲我可憐的英文)

+0

謝謝大家,我正在測試IntentService和其他東西......需要更多的時間來實現這一點後,你的建議。 :-) – RRTW

回答

3

okey我會嘗試根據我對您問題的理解給出一個解決方案: 您有一張包含照片的列表,並且您希望用戶有資格上傳這些圖片並更新其狀態的用戶狀態(已上傳/上傳/上傳/失敗),並且您不想在每次上傳時啓動Service

一個簡單可行的解決方案是使用IntnetService我將只運行如果沒有分配給它的任務,將原子關閉時完成的工作,當然有IntentService

工作時的作業將在sperate線程
step 1 

使數據庫表包含關於圖像的

_id integer 
_image_uri 
_image_status : 

_image_status數據將保持這些值中的一個(1-上傳:finish_uploaded,2-上傳:服務是上傳荷蘭國際集團的形象,3上傳:用戶可上傳圖片4失敗:未能現在上傳您可以重試)

step2 

UploadIntentService嘗試將圖片上傳到服務器,當如果上傳成功競爭或發生錯誤時,如果你想上傳任何圖片上傳我們更新數據庫

public class UploadIntentService extends IntentService { 
    private static final String TAG = UploadIntentService.class.getSimpleName(); 
    private static final int STATUS_UPLOAD = 0x01; //can be uploaded 
    public static final int STATUS_FAILED_TO_UPLOAD = 0x02; // tried to upload but failed 
    public static final int STATUS_UPLOADING = 0x03; // self explanied 
    public static final int STATUS_SUCCESSFULLY_UPLOADED = 0x04; // the image uploaded to server 

    public UploadIntentService() { 
     super(TAG); 

    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 

     int status = intent.getIntExtra("status", -1); 
     String imageUri = intent.getStringExtra("image_path"); 
     long imageDatabaseid = intent.getLongExtra("image_db_address",-1); 

     if(status != STATUS_SUCCESSFULLY_UPLOADED && status != STATUS_UPLOADING){ 

      try{ 
       //update _image_status column with value of STATUS_UPLOADING with the image_id = imageDatabaseid; 

       //upload code 

       //successfully uploaded 
       //update _image_status column with value of STATUS_SUCCESSFULLY_UPLOADED with the image_id = imageDatabaseid; 
      }catch(Exception ex){ 
       ex.printStackTrace(); 
       //update _image_status column with value of STATUS_FAILED_TO_UPLOAD with the image_id = imageDatabaseid; 
      } 
     } 

    } 

} 

......

step3 

,你ListActivity E本代碼

Intent intent = new Intent(context, UploadIntentService.class); 
    Bundle uploadExtras = new Bundle(3); 
    uploadExtras.putLong("image_db_address", PUT HERE THE IMAGE DATABASE ID); 
    uploadExtras.putInt("status", PUT HERE THE IMAGE STATUS); 
    uploadExtras.putString("image_path", PUT HERE THE IMAGE PATH IN FILE SYSTEM); 

    intent.putExtras(uploadExtras); 
    context.startService(intent); 

....... 第4步

確保你聲明在manifest.xml服務,並享受。

+0

儘管它不是最好的解決方案:)你可以增強它 – confucius

1

您可以製作一個BlockingQueue,您將在其中存儲要上傳的照片。這BlockingQueue是你的PhotoList。在Service的循環中,您將看到這個BlockingQueue。兩種情況是可能的:

  1. 有一些照片。把它和上傳。
  2. 隊列爲空。所以線程會進入睡眠狀態,BlockingQueue保證這一點。
1

您的服務應該覆蓋onResume()函數。只要用戶執行其他任務,打開其他活動等,並最終返回到應用程序的活動,就會調用onResume()。這只是要點。

您可以瞭解更多關於Runtime Changes的資料。適用於「活動」的概念也適用於「服務」,在該服務中,只是未向用戶「顯示」。

在上面的鏈接中,您將瞭解何時重新創建活動以及何時通過調用onResume()實際恢復活動。您還需要覆蓋onSaveInstanceState()onRestoreInstanceState(),以便在舊的Activity實例和新的Activity實例之間傳遞狀態對象。

你可以做的是,當用戶離開你的活動,在你的onSaveInstanceState(),你應該保存你的狀態變量,例如。您的所選照片列表,在一個Bundle中。並通過這種捆綁到onRestoreInstanceState()

問題:你真正開始你的服務爲有效Service?我的意思是,你是否擴展了Service類?我爲我的項目使用了服務,並且他們總是在他們離開的地方重新開始而沒有壓倒一切。 原因:服務在後臺運行,只有在服務完成後才能釋放資源。所以如果你還沒有使用服務,那麼我建議你這樣做。你的問題將得到照顧。

+1

是的,我確實擴展了Service類。我現在正在開發一個新項目,你的消息確實幫了我:-) – RRTW