Как применить асинхронную задачу в этом - PullRequest
2 голосов
/ 03 декабря 2011

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

Я пробовал многопоточность, которая тоже не работала.Все, что я хочу сделать, это запустить сканирование в фоновом режиме и показать индикатор выполнения.

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}

private void populateView() {

    List<PackageInfo> adPackages = getAdPackages();
    PackageManager pm = getPackageManager();

    List<Map<String, String>> data = new ArrayList<Map<String, String>>(adPackages.size());
    for(PackageInfo pkg : adPackages) {
        Map<String, String> attrs = new HashMap<String, String>();
        attrs.put("App Name", pm.getApplicationLabel(pkg.applicationInfo).toString());
        attrs.put("Package Name", pkg.packageName);
        data.add(attrs);
    }

    String[] from = new String[] {
        "App Name",
        "Package Name"
    };
    int[] to = new int[] {
        android.R.id.text1,
        android.R.id.text2
    };
    SimpleAdapter adapter = new SimpleAdapter(
            this, data, android.R.layout.two_line_list_item, from, to);

    setListAdapter(adapter);
    mPackages = adPackages;
}

.

private List<PackageInfo> getAdPackages() {
    Set<PackageInfo> adPackages = new HashSet<PackageInfo>();

//[...]
    List<ApplicationInfo> appInfos = pm.getInstalledApplications(0);

    for(ApplicationInfo appInfo : appInfos) {

        try {

            //[Heavy Stuff]

    return new ArrayList<PackageInfo>(adPackages);

   }
}

1 Ответ

2 голосов
/ 03 декабря 2011

Да, это можно сделать.

Вы должны переместить вашу getPackages логику в doInBackground из AsyncTask.И вам нужно позвонить publishProgress из doInBackground, если вы хотите обновить индикатор выполнения.

Как только doInBackground завершено, тогда вызывается onPostExecute.Положите всю логику для данных для адаптера и самого адаптера в нем.Настройте адаптер также в функции.

Ниже приведено несколько справочных документов, на которые вы можете ссылаться:

Асинхронная задача Рабочие потоки

Вот пример:

 private class GetPackageTask extends AsyncTask<Void, Integer, List<PackageInfo>> {
 protected List<PackageInfo> doInBackground(URL... urls) {

     // Put your code of getPackages in here

     // You can call publish like it is done below
     //for (int i = 0; i < count; i++) {
     //    totalSize += Downloader.downloadFile(urls[i]);
     //    publishProgress((int) ((i / (float) count) * 100));
     //}

     // adPackages is what you returning from your getPackages function
     return adPackages;
 }

 protected void onProgressUpdate(Integer... progress) {
     setProgressPercent(progress[0]);
 }

 protected void onPostExecute(List<PackageInfo> result) {
     // Here you will have all the setAdapter related code
 }
}

onCreate будет содержать

new DownloadFilesTask (). Execute ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...