0

4 つのアダプターを備えた 4 つのフラグメントを含むスクロール可能なタブ レイアウトがあります。各フラグメントには、SoundPool短い mp3 クリップを再生するために使用するいくつかのボタンがあります。ほとんどの場合 (ボタンをクリックした後のいくつかのクラッシュを除いて) 動作しますが、あるフラグメントから別のフラグメントへのスクロールに時間がかかることに気付きました。また、短いクリップを使用して見たものに基づいてMediaPlayer切り替える前にアイテムを使用していましたが、最初のページをロードするのに時間がかかり、クリックするとアプリがクラッシュすることがあります ( . そのため、スクロールをよりスムーズにし (ハードウェア アクセラレーションをオンにしています)、ページの読み込みを高速化し、ボタンがクラッシュしないようにしたいと考えています。今私は持っています:SoundPoolMediaPlayer

MainActivity で:

public static class MiscFragment extends Fragment {

    public MiscFragment() {

    }
    View rootView;
    GridView gridView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.tab_fragment,
                container, false);

        gridView = (GridView) rootView.findViewById(R.id.tabgridview);
        gridView.setAdapter(new MiscAdapter(getActivity()));
        return rootView;
    }


}

Fragmentsこれは、私が使用している他のクラスと同じ内部クラスです。そして対応するAdapterクラス:

public class MiscAdapter extends BaseAdapter {

private Context mContext;
private String[] mButtons = { "Button1", "Button2", "Button3"};

public MiscAdapter(Context c) {
    mContext = c;
}

@Override
public int getCount() {

    return mButtons.length;
}

@Override
public Object getItem(int position) {

    return null;
}

@Override
public long getItemId(int position) {

    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    Button myButton;

    if (convertView == null) {
        myButton = new Button(mContext);
        myButton.setLayoutParams(new GridView.LayoutParams(230, 150));
        myButton.setPadding(8, 8, 8, 8);

        convertView = myButton;
    } else {
        myButton = (Button) convertView;
    }

    myButton.setText(mButtons[position]);
    myButton.setId(position);
    myButton.setTag(Integer.valueOf(position));
    myButton.setOnClickListener(new MyOnClickListener(position));

    return convertView;
}


class MyOnClickListener implements OnClickListener {

    private int position;
    final SoundPool pool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
    List<Integer> streams = new ArrayList<Integer>();
    final int soundID1 = pool.load(mContext, R.raw.mp3_1, 1);
    final int soundID2 = pool.load(mContext, R.raw.mp3_2, 1);
    final int soundID3 = pool.load(mContext, R.raw.mp3_3, 1);


    public MyOnClickListener(int position) {

        this.position = position;

    }

    public void onClick(View v) {

        position = v.getId();

        if(position == 0){
            int streamID1 = pool.play(soundID1, 1.0f, 1.0f, 1, 0, 1.0f);
            streams.add(streamID1);
        }
        if(position == 1){
            int streamID2 = pool.play(soundID2, 1.0f, 1.0f, 1, 0, 1.0f);
            streams.add(streamID2);
        }
        if(position == 2){
            int streamID3 = pool.play(soundID3, 1.0f, 1.0f, 1, 0, 1.0f);
            streams.add(streamID3);
        }


    }

}

この Adapter クラスは、他の 用に複製されFragmentsます。GridView問題は、すべてのアダプターでand/orを繰り返し使用することだと思いますが、SoundPoolよくわかりません。どんな助けでも本当に感謝します!

4

1 に答える 1

0

できる限り、メインスレッドに何かをロードしないでください。サウンドプールを共有するのではなく、それぞれロードするのはなぜですか。ほとんどの場合、読み込みに時間がかかりすぎます。サウンド プールはバックグラウンド スレッドで 1 回だけロードする必要があります。

于 2013-06-14T17:05:58.550 に答える