1

幼児の息子の音で響板アプリを作っています。アプリは MainActivity クラスを開くだけで、ボタンのスクロール可能なリストが表示されます。このリストを押すと、息子が何かを叫んでいる録音済みの MP3 が再生されます。

Nexus 7 でデバッグまたは実行すると、Choreographer エラーが発生し、50 ~ 90 フレームがスキップされます。警告は、「アプリケーションがメイン スレッドで処理しすぎている可能性がある」というものです。私のデバイスでは、アプリを閉じて再度開くまで、3 つのランダム ボタンがサウンドの再生を拒否しますが、別の 3 つのランダム ボタンは動作を拒否します。この問題は、アプリの単純な LinearLayout (ScrollView なし) に 8 つのボタンしかない場合には発生しませんでした。

私は Java と Android の両方のプログラミングの初心者ですが、私の推測では、笑えるほど貧弱なコードは適切に機能するためにメモリを大量に消費しています。私の質問は、独自のサウンドを再生する 33 個のボタンのスクロール可能なリストをどのようにコーディングしますか、または誰かが私のコードを改善する方法を教えてくれませんか?

MainActivity.java (この質問の最初の 3 つのボタン/サウンドのみを表示):

import android.media.MediaPlayer;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.Button;
import android.view.View;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

final MediaPlayer ahh = MediaPlayer.create(this, R.raw.ahh);
final MediaPlayer dededeh = MediaPlayer.create(this, R.raw.dededeh);
final MediaPlayer neganegabunbunbug = MediaPlayer.create(this, R.raw.naganagbunbun);

Button bahh = (Button) this.findViewById(R.id.Ahhhbutton);
bahh.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        ahh.start();
    }
});
}
}

そして activity_main.xml (この質問の最初の 3 つのボタンのみ):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tab1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin" >

<ScrollView
    android:id="@+id/scrollView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <Button
            android:id="@+id/Ahhhbutton"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="5dp"
            android:background="@layout/button_shape"
            android:text="@string/button1a"
            android:textColor="#d1d1d1"
            android:textSize="20sp" />

        <Button
            android:id="@+id/dededehbutton"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="5dp"
            android:background="@layout/button_shape"
            android:text="@string/button1b"
            android:textColor="#d1d1d1"
            android:textSize="20sp" />

        <Button
            android:id="@+id/neganegabunbunbugbutton"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="5dp"
            android:background="@layout/button_shape"
            android:text="@string/button1c"
            android:textColor="#d1d1d1"
            android:textSize="20sp" />



Button bdededeh = (Button) this.findViewById(R.id.dededehbutton);
bdededeh.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        dededeh.start();
    }
});

Button bnaganagbunbun = (Button) this.findViewById(R.id.naganagabunbutton);
bnaganagbunbun.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        neganegabunbunbug.start();
    }
});

    </LinearLayout>
</ScrollView>

</LinearLayout>
4

1 に答える 1

0

レイアウトではありません。エラーが言ったように、メインスレッドで長期的な作業を行うべきではありません。

メインスレッド (または Android では UI スレッド) は、ユーザーとの対話を処理します。UI がフリーズしたり速く感じたりしないようにするには、UI スレッドから長期的なアクションを実行する必要があります。

また、問題は実際の再生ではなく、すべてのメディア ファイルをロードすることです。

MediaPlayer.create(this, R.raw.ahh);

create()-methodのドキュメントが示唆するように:

[...] MediaPlayer を使い終わったら、release() を呼び出してリソースを解放する必要があります。リリースされていない場合、MediaPlayer インスタンスが多すぎると例外が発生します。

「UI スレッドから離れた」ものについては、次の 3 つのオプションがあります。

  • サウンドを再生して(最大のコントロール、より多くのコード) にRunnable送信する実装クラスを直接作成できます。ScheduledThreadPoolExecuter
  • AsyncTask(Android専用)を使用して曲を再生します(かなり簡単です)。
  • アプリが現在フォアグラウンドにないときでもサウンド再生を継続したい場合は、Service(ほとんどの作業)を使用します。

したがって、あなたがすべきことは次のとおりです。

  1. 生ファイル参照 ( R.raw.ahh)のリストを保存し、それらを直接ロードしないでください。
  2. 再生する曲を選択したら、その曲の ID を呼び出しcreate()て、UI スレッドから再生を開始します。
  3. 完了したら、呼び出しrelease()てリソースを解放します。
于 2013-04-07T02:14:11.930 に答える