2013-08-29 52 views
0

我想我沒有得到關於android活動生命週期的東西。調用AsyncTask時,何處獲取新Intent的上下文?

所以這裏是我的情況 - 我有一個AsyncTask來完成將XML文件上傳到服務器的工作。當用戶在活動中填寫所需數據後按下按鈕時調用它。被調用後,我不再需要這個活動了,所以我打電話給finish();立即。

task = new ASSend(data); 
task.execute(); 
finish(); 

不過,我需要顯示的情況下的AsyncTask(所以我需要爲使用的AlertDialog或對話爲主題的意圖)的執行過程中出現問題的錯誤信息,我也需要打開文件在doInBackground與

FileInputStream fis;  
fis = context.openFileInput(filePath); 

需要上下文。即使啓動AsyncTask的活動不再存在,是否可以傳遞啓動AsyncTask的活動的上下文來完成所有這些操作?

+0

你可以保持對它的引用,但是這將是一個可怕的上下文泄漏:http://android-developers.blogspot.de/2009/01/avoiding-memory-leaks.html – zapl

+0

你爲什麼不使如果上傳失敗,異步任務將啓動的新對話框活動。它可以要求用戶再次嘗試... – Shmuel

+0

啓動服務(而不是強制AsyncTask啓動你的Activity)執行你的ASyncTask。你可以在後臺爲你想要的一切服務。 – Vyacheslav

回答

1

我不認爲AsyncTask是在這裏使用的正確類。我認爲你應該使用一個IntentService相反,有幾個原因:

  1. Service■找一個更高的處理優先級,這意味着主機主動式Service s爲不太可能被系統殺死進程。換句話說,在Activity中使用AsyncTask會更危險,因爲系統在低內存情況下更有可能會中止您的應用程序進程。

  2. 您不必擔心泄漏活動上下文(因爲Service不直接綁定到Activity生命週期)。

  3. 立即 - 您不需要用Dialog阻止用戶界面,並等待任務完成。您可以使用IntentService排隊要執行的任務,並立即離開Activity,並且任務最終將異步執行。

+1

我想補充說,你的錯誤報告應該可能是通知而不是對話框。彈出錯誤對話框時,用戶甚至可能不會使用您的應用程序。很不禮貌。 – Krylez

+0

@Krylez同意。 :) –

2

也許您不應該立即致電finish()活動。嘗試在異步任務中添加進度對話框以顯示各種加載屏幕。

public class task extends AsyncTask<Object, Object, Object> { 
ProgressDialog mDialog; 
Context mContext; 

    public task (Context context) { 
     this.mContext = context; 
    } 
    @Override 
protected void onPreExecute() { 
    super.onPreExecute(); 

    mDialog = new ProgressDialog(mContext); 
    mDialog.setMessage("Preparing Route..."); 
    mDialog.show(); 
} 

    @Override 
protected void onPostExecute(Object obj) { 
    mDialog.dismiss(); 
      // then call finish? 
} 
+0

雖然這真的很棒。您不必按照需要立即退出活動,您需要彈出一個對話框並等待不確定的時間,然後才能退出活動。 –

+0

我確實需要允許用戶在上傳xml的同時在其他活動中工作 - 它可以變得非常大。 – AlcherBlack

+0

@AlcherBlack,如果是這樣,爲什麼不在調用execute之後立即將意圖傳遞給另一個活動,而不是'finish();' – linus

0

在您的活動中,調用this.getApplicationContext()以獲取將超出活動生命週期的上下文。

+0

但linus的回答比較好。 –