1

嗨,我是 android 编程新手,我在应用程序初始化时遇到了一些问题。我将先解释应用程序结构,然后再解释问题。

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

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

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

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

  • 单身人士
  • 应用对象

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

我认为这主要取决于用例,在您的特定代码示例中,我倾向于创建一个单例,这将使 controlreceiver 保持活动状态并可供任何活动使用(更准确地说,单例将管理 controlreceiver 的生命周期) .

于 2013-06-11T10:55:49.427 回答
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();
    ...
于 2013-06-11T10:07:33.490 回答