0

リスト ビューがあり、すべての項目に 3 つのボタンが含まれています。1 つはデータベースに保存するためのもので、残りの 2 つは新しいフラグメントを開く必要があります。アダプターの 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

サービス

アクティビティのライフサイクルに制限されないため、アプリケーションが閉じている/切り替えられている/構成が変更されている場合でも、サービスは実行されます

サービスが実行する操作はメイン(UI)スレッドで実行されるため、onStartCommand()メソッド内にJavaスレッドを作成する必要があります

インテント サービス

アクティビティのライフサイクルに制限されないため、アプリケーションが閉じている/切り替えられている/構成が変更されている場合でも、サービスは実行されます

IntentService で実行される操作は「単一のワーカー スレッド」で実行されます。 注: 「単一のワーカー スレッド」で実行されるため、マルチスレッド アプリケーションには適していません。

非同期タスク

アクティビティのライフサイクルに制限されているため、アプリケーションが閉じている/切り替えられている/構成が変更されている場合、サービスは実行されないため、AsyncTask を使用する際はこれらを考慮する必要があります

于 2016-02-26T12:51:48.473 に答える
0

保存の進行状況を表示したい場合は、画像の保存中にスピナーを表示することも検討してください。DB への保存が完了したら、完了ステータスを送信し、プログレス バーを閉じます。その方法のサンプルが必要な場合は、以下のリンクを参照してください。 postExecute が呼び出されたときに AsyncTask にリスナーを追加する

于 2016-02-26T12:20:36.427 に答える