Android Application Init和全局对象

时间:2013-06-11 09:54:25

标签: android android-layout

您好我是Android编程的新手,我在应用程序初始化时遇到了一些问题。我先解释app结构,然后解决问题。

应用程序有一个应始终运行并在Datagram套接字上侦听的线程。每当收到消息时,它都会采取适当的措施。在某些操作上,我需要上下文对象,我还使用 Handler 对象将数据传递给UI线程。这两个对象都是通过传递主活动的 OnCreate 方法在我的Thread类的构造函数中初始化的。 现在我遇到的问题是,无论何时切换我的活动或倾斜手机,主活动中的所有对象都会重新创建,并且我之前传递给处理程序上下文<的Thread类的引用/ strong>变得无效。

我应该如何处理这个问题。提前致谢。应用程序结构是这样的。

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);

    }
};

2 个答案:

答案 0 :(得分:1)

似乎有两所学校用于管理具有应用程序生命周期的对象:

  • 应用程序对象

以下是关于它的主题: Singletons vs. Application Context in Android?

我认为它主要取决于用例,在您的特定代码示例中,我倾向于创建一个单例,这将使控制接收器保持活动并可用于任何活动(更准确地说,单例将管理生命周期控制接收者)。

答案 1 :(得分:0)

我的两种避免手机轮换对象娱乐的方法: 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();
    ...