Как сделать длительные операции по щелчку элемента списка, но не по потоку пользовательского интерфейса?

У меня есть представление списка, в котором каждый элемент содержит 3 кнопки, одну для сохранения в базе данных, а две другие должны открывать новые фрагменты. Я реализовал OnClickListener для какой из кнопок в методе getView() адаптера. Когда пользователь нажимает кнопку сохранения, я хочу записать элемент в базу данных. Поскольку запись в базу данных считается длительной операцией, и ее нельзя выполнять в потоке пользовательского интерфейса, я хотел бы спросить, как это сделать? Должен ли я создать свой собственный поток или я могу использовать службу или асинхронную задачу? Вот код из getView:

 public View getView(final int position, View convertView, ViewGroup parent) {

    ViewHolder viewHolder;
    if(convertView==null){
        convertView=layoutInflater.inflate(R.layout.top_tracks_artists_item_layout,parent,false);

        viewHolder=new ViewHolder();
        viewHolder.trackName= (TextView) convertView.findViewById(R.id.top_tracks_item_name);

        viewHolder.trackInfo= (Button) convertView.findViewById(R.id.top_tracks_item_info);
        viewHolder.trackInfo.setTag(position);
        viewHolder.trackInfo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("try", "Info clicked "  +position);
            }
        });

        viewHolder.trackFavourite= (Button) convertView.findViewById(R.id.top_tracks_item_favourite);
        viewHolder.trackFavourite.setTag(position);
        viewHolder.trackFavourite.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Log.d("try", "favourites  clicked " +position);
            }
        });

        viewHolder.trackWatch= (Button) convertView.findViewById(R.id.top_tracks_item_watch);
        viewHolder.trackWatch.setTag(position);
        viewHolder.trackWatch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("try", "Watch clicked "  +position);
    //here I want to save to database

            }
        });

        convertView.setTag(viewHolder);
    }else{
        viewHolder= (ViewHolder) convertView.getTag();
    }

    viewHolder.trackName.setText((String)tracks.get(position).toString());

    return convertView;
}

Заранее спасибо.


person green    schedule 26.02.2016    source источник


Ответы (4)


Для этого вы можете использовать асинхронную задачу или обработчики. Здесь см. приведенный ниже учебник и ссылку в данной ссылке.

http://www.vogella.com/tutorials/AndroidBackgroundProcessing/article.html

person Nidhin Prathap    schedule 26.02.2016
comment
Но могу ли я определить асинхронную задачу в адаптере? - person green; 26.02.2016
comment
Создайте или определите асинтаск в своем адаптере или действии. и при щелчке элемента просто выполните асинхронную функцию.... - person Nidhin Prathap; 26.02.2016

Вы можете попробовать с AsyncTask, также рассмотрите возможность показа счетчика при сохранении изображения, если хотите показать ход сохранения. После завершения сохранения в БД отправьте статус «Выполнено» и закройте индикатор выполнения. Если вам нужен образец того, как это сделать, перейдите по ссылке ниже. Добавить прослушиватель в AsyncTask при вызове postExecute

person Guru_VL    schedule 26.02.2016

Используйте Android AsyncTask для фоновых задач. Использование такое ;

    private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

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

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }
person Fuat ÖZERGİL    schedule 26.02.2016

Сервис

Не привязаны к жизненному циклу активности, службы будут работать, даже если ваше приложение закрыто/переключено/изменено в конфигурации.

Операция, выполняемая службой, выполняется в основном (UI) потоке, поэтому вам необходимо создать Java-поток внутри метода onStartCommand().

Служба намерений

Не привязаны к жизненному циклу активности, службы будут работать, даже если ваше приложение закрыто/переключено/изменено в конфигурации.

Операция, выполняемая IntentService, выполняется в одном рабочем потоке. Примечание. Поскольку она выполняется в одном рабочем потоке, она не подходит для многопоточных приложений.

Асинхронная задача

Ограниченные жизненным циклом активности, службы не будут работать, если ваше приложение закрыто/переключено/изменено в конфигурации, поэтому вам необходимо учитывать это при использовании AsyncTask.

person Abhishek Kumar    schedule 26.02.2016