2013-08-01 33 views
0

我有一個是發射時執行的異步任務:向前傳遞AsyncTask的結果?

public class BufferApps extends AsyncTask<String, Void, ArrayList<PackageInfo>> { 

PackageManager mPackageManager; 
Context mContext; 

public BufferApps(PackageManager pm, Context context){ 
    super(); 
    this.mPackageManager = pm; 
    this.mContext = context; 
} 

    protected ArrayList<PackageInfo> doInBackground(String... strings) { 

     //this code works, not where the problem is 

     return installedApps; 
    } 

    protected void onPostExecute(ArrayList<PackageInfo> installedApps) { 

     ? 

     Toast.makeText(mContext, "Finished!", Toast.LENGTH_SHORT).show(); 
    } 
} 

基本上這裏發生了什麼是我創建的對象的ArrayList,特別是通過設備上的用戶安裝的所有應用程序的列表。我想我只是在這裏畫一個空白,但我一直在嘗試這一段時間,不能完全弄明白:我傳遞給onPostExecute的installedApps似乎沒問題。所以說installedApps就是上面描述的列表。

我想要的是將這個列表存儲在某個地方,這樣當我需要在我的設備上安裝的應用程序列表時,我可以快速訪問它,而無需執行加載已安裝應用程序的所有艱難工作(doInBackground中的代碼需要相當長的時間來執行)。我怎樣才能做到這一點?

我已經嘗試過gson序列化與SharedPreference一起使用,由於某種原因會引發錯誤。我試圖創建一個單獨的類只有一個ArrayList對象是static來包含這些條目,但這也似乎失敗。如果有必要,我可以提出我的嘗試,但是如果任何人都可以推薦一個好方法來存儲ArrayList,以便其他所有活動都可以輕鬆訪問它,那將是最有幫助的。

+0

你應該看看不同選項的Android爲您提供:http://developer.android.com/guide/topics/data/data-storage.html –

+1

您可以使用。調用AsyncTask的類中的get()方法。如... BufferApps.execute(); arrayList = BufferApps.get(); –

回答

1

將它存儲在您的應用程序類中。也就是說,在您的onPostExecute()延長Application,並指定這個類在你的清單,

<application 
     android:name=".MyApplication" 

現在實現你的應用程序類這樣的,

public class MyApplication extends Application { 

    private final List<App> apps = new ArrayList<App>(); 

    public void setApps(List<App> apps) { 
    this.apps = apps; 
    } 

    public List<App> getApps() { 
    return apps; 
    } 
} 

,打電話,

((MyApplication)getApplication()).setApps(apps); 

隨時隨地你需要來自任何其他組件的應用程序,請致電

List<App> apps = ((MyApplication)getApplication()).getApps(); 

您仍然需要考慮應用程序列表尚不可用時所做的複雜性。對於這一點,你可以

  1. 創建自己的回調接口...例如,而不是調用getApps(),並採取返回結果,你叫getApps(),並傳遞一個回調。 getApps()的實現然後要麼立即調用回調,如果它有,或者啓動AsyncTask並在onPostExecute()中調用回調。

  2. 只是從getApps()返回空,如果它不可用,並且啓動AsyncTask。當任務完成時,廣播一個意圖,表明應用程序現在可用。有興趣的來電者必須註冊意圖並妥善處理。