0

我有一个列表视图,其中每个项目包含 3 个按钮,一个用于保存在数据库中,另外两个应该打开新的片段。我已经为适配器的 getView() 方法中的哪个按钮实现了 OnClickListener。当用户单击保存按钮时,我想在数据库中写入项目。既然写数据库被认为是长操作,不应该在UI线程上做,请问怎么做?我应该创建自己的线程还是可以使用服务或异步任务?这是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;
}

先感谢您。

4

4 回答 4

0

将 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");
     }
 }
于 2016-02-26T12:25:42.233 回答
0

您可以使用异步任务或处理程序来实现这一点。在这里查看下面的教程和给定链接中的参考

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

于 2016-02-26T12:26:12.987 回答
0

服务

不受 Activity 生命周期的限制,即使您的应用程序关闭/切换/配置更改,服务也会运行

服务要执行的操作在 Main(UI) 线程中运行,因此您需要在 onStartCommand() 方法中创建一个 Java-Thread

意向服务

不受 Activity 生命周期的限制,即使您的应用程序关闭/切换/配置更改,服务也会运行

IntentService 执行的操作在“单工作线程”中运行 注意:由于它在“单工作线程”上运行,因此不适合多线程应用程序

异步任务

受限于 Activity 生命周期,如果您的应用程序关闭/切换/配置更改,服务将无法运行,因此您在使用 AsyncTask 时需要考虑这些

于 2016-02-26T12:51:48.473 回答
0

您可以尝试使用 AsyncTask,如果您想显示保存进度,还可以考虑在保存图像时显示微调器。一旦您保存到数据库完成发送状态完成并关闭您的进度条。如果您需要一些有关如何操作的示例,请参阅下面的链接。 调用 postExecute 时在 AsyncTask 中添加监听器

于 2016-02-26T12:20:36.427 回答