1

こんにちは、Android プログラミングは初めてで、アプリケーションの初期化に問題がありました。最初にアプリの構造を説明し、次に問題を説明します。

アプリケーションには、Datagram ソケットで常に実行およびリッスンする必要があるスレッドがあります。メッセージが受信されるたびに、適切なアクションが実行されます。特定のアクションではContextオブジェクトが必要で、データを UI スレッドに渡すためにHandlerオブジェクトも使用します。これらのオブジェクトは両方とも、メイン アクティビティのOnCreateメソッドから渡すことによって、Thread クラスのコンストラクターで初期化されました。現在、アクティビティが切り替えられるか、電話を傾けるたびに、メイン アクティビティのすべてのオブジェクトが再作成され、前にHandlerContextの Thread クラスに渡した参照が無効になるという問題が発生しています。

この問題をどのように処理すればよいですか。前もって感謝します。アプリ構成はこんな感じ。

public class MainActivity extends Activity {
    private Context ctx;
    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            Bundle bundle = msg.getData();
            String mtype = bundle.getString("mtype");

            // DO SOME STUFF HERE //

        }

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        // OTHER INITIALIZATIONS //

        ctx = this;
        rxThread = new ControlReceiver(ctx, handler);
        rxThread.start();

    }
};

スレッドクラスはこんな感じ。

public class ControlReceiver extends Thread {
    private Context context;
    private Handler handler;


    ControlReceiver(Context c, Handler h){
        context = c;
        handler = h;
    }

    public void run() {

        // DO STUFF HERE //

        // SEND MESSAGE TO UI //
        msg = handler.obtainMessage();
        bundle = new Bundle();
        bundle.putString("mtype", "ECHTB");
        msg.setData(bundle);
        handler.sendMessage(msg);

    }
};
4

2 に答える 2

1

アプリケーションのライフサイクルを持つオブジェクトを管理するための 2 つの学校があるようです。

  • シングルトン
  • アプリケーション オブジェクト

それについてのトピックは次のとおりです 。Singletons vs. Application Context in Android?

それは主にユースケースに依存すると思います。特定のコードサンプルでは、​​コントロールレシーバーを存続させ、あらゆるアクティビティで利用できるようにするシングルトンを作成することをお勧めします(より正確には、シングルトンはコントロールレシーバーのライフサイクルを管理します)。 .

于 2013-06-11T10:55:49.427 に答える
0

電話の回転時にオブジェクトの再作成を回避する2つの方法:1)そのアクティビティのマニフェストで方​​向(垂直/水平)を強制します

<activity
android:name=".MainMenu"
android:screenOrientation="portrait" >
</activity>

2)オリエンテーションを管理します。マニフェストで、アクティビティが変更を処理することを宣言します

<activity
android:name=".tools.ToolGPSRecorder"
android:configChanges="keyboardHidden|orientation|screenSize"
android:screenOrientation="sensor" >
</activity>

この場合、アクティビティでは、電話を回転させながら onConfigurationChanged イベントが発生します。このイベントでは、特定のレイアウト ランドのレイアウトをロードします。

i.e.
@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    MyLog.d("ToolGPSRecorder.onConfigurationChanged");
    setContentView(R.layout.tool_gpsrecorder);
    ResetTimersAndLogs();
    ShowCoveredDistance();
    UpdateRecordingTime();
    ...
于 2013-06-11T10:07:33.490 に答える