1

これは最近私を本当に混乱させています。開始するスレッドがあり、それを強制終了するまで実行し続けます-while変数をfalseに設定します。

これはすべて正常に機能しますが、方向の変更時にスレッドとの接触が失われるため、停止できません。問題を明確にするためにこれを書きました:

public class FTTest extends Activity {

boolean isPlaying = false;
Player player = new Player();

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

public void play(View v) {
    if (!isPlaying) {
        Log.d("Play Button", "Start Pressed");
        player.start();
        isPlaying = true;
    } else {
        Log.d("Play Button", "Stop Pressed");
        player.going=false;
        isPlaying = false;
    }
}

}

プレイヤーはこれだけです:

public class Player extends Thread{
int i;
public boolean going=true;

public void run(){
    while(going){
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        i++;
        Log.d("Thread", "Running "+i+" times");
    }
}

}

これを解決するためにフラグメントを使用することについて読んでいますが、このコンテキストでそれらを使用する方法について頭を悩ませることはできません。私が見逃している簡単なものはありますか?

ご協力いただきありがとうございます、

マイク

4

2 に答える 2

2

アイデアは、フラグメントを保持できるようにすることです(フラグメントは破棄されません..向きが変わっても保持されます)。アクティビティが再作成され、まだスレッドを実行している Fragment に再接続されます。

public class FTTest extends Activity {

    private FTFragment fragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (savedInstanceState == null) {
            fragment = new FTFragment();
            getFragmentManager().beginTransaction().add(android.R.id.content, fragment).commit();
        }
        else {
          fragment = (FTFragment)getFragmentManager().findFragmentById(android.R.id.content);
        }
    }
}

保持フラグメント クラス

public class FTFragment extends Fragment
{
    boolean isPlaying = false;
    Player player = new Player();

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }

    public void play(View v) {
        if (!isPlaying) {
            Log.d("Play Button", "Start Pressed");
            player.start();
            isPlaying = true;
        } else {
            Log.d("Play Button", "Stop Pressed");
            player.going=false;
            isPlaying = false;
        }
    }

}

あなたが今呼んだあなたの活動であなたplay(View)は呼ぶべきですfragment.play(View);

于 2013-02-13T15:14:09.597 に答える
0

起こっていることは、向きを変えると、アクティビティが再作成されていることだと思います(通常、Androidで行われているように)。これが発生すると、Playerオブジェクトも再初期化されます。

したがって、実際には新しいPlayerオブジェクトへの参照があり、古いオブジェクトは制御の外で問題なく実行され続けます。

これを処理するには多くの方法があります。このブログ投稿が役に立ちます。

http://blog.andresteingress.com/2011/09/27/fighting-orientation-changes-in-android/

于 2013-02-13T15:19:54.367 に答える