2013-08-01 2 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 объектов, в частности, список всех приложений, установленных пользователем на устройстве. Я думаю, что я просто рисую здесь пробел, но я пробовал это некоторое время и не могу понять: installedApps Я перехожу к onPostExecute, кажется, в порядке. Поэтому скажем, что installedApps - это список, описанный выше.

Я хочу сохранить этот список где-нибудь, чтобы, когда мне нужен список установленных приложений на моем устройстве, я могу быстро получить к нему доступ, не выполняя всю тяжелую работу по загрузке установленных приложений (код в doInBackground занимает достаточное количество времени для выполнения). Как я могу это сделать?

Я пробовал сериализацию gson в сочетании с SharedPreference, это вызвало ошибки по некоторым причинам. Я попытался создать отдельный класс с одним объектом ArrayList, который был static, чтобы содержать эти записи, но это также, казалось, не получилось. Я могу приложить свои усилия, если это необходимо, но если кто-нибудь может просто рекомендовать мне хороший способ хранения ArrayList, чтобы он мог легко получить доступ ко всем другим действиям, это было бы наиболее полезно.

+0

Вы должны взглянуть на различные варианты Android обеспечивает: http://developer.android.com/guide/topics/data/data-storage.html –

+1

Вы можете быть в состоянии использовать. get() из класса, который вызывает ваш AsyncTask. Такие, как ... BufferApps.execute(); arrayList = BufferApps.get(); –

ответ

1

Сохраните его в своем классе приложений. то есть расширить 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; 
    } 
} 

в вашем onPostExecute(), звоните,

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

в любое время вам нужны приложения из любого другого компонента, звоните,

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

вам все равно нужно учитывать сложность того, что вы делаете, когда список приложений еще не доступен. для этого, вы можете

  1. создать свой собственный интерфейс обратного вызова ... например, вместо вызова getApps() и принимая обратный результат, вы звоните getApps() и передать в функции обратного вызова. реализация getApps() затем либо сразу вызывает обратный вызов, если он имеет его, либо запускает AsyncTask и вызывает обратный вызов в onPostExecute().

  2. просто верните null от getApps(), если он недоступен, и запустите AsyncTask. когда задача завершается, передайте намерение, которое указывает, что приложения теперь доступны. заинтересованные абоненты должны зарегистрироваться для намерения и обработать его соответствующим образом.

Смежные вопросы