gpt4 book ai didi

android - 为什么我的 HandlerThread 正在更新 UI

转载 作者:太空狗 更新时间:2023-10-29 13:55:05 24 4
gpt4 key购买 nike

我目前正在使用一个简单的相机示例在 Android 中练习 HandlerThread - 问题是如果我在 onCreate 中创建我的 CameraController 对象并发送为了处理我的 openCamera() 方法(包含直接 UI 更新代码)

向处理程序线程发送消息

它允许我更新 UI,尽管我不应该被允许这样做 - 因为从技术上讲我应该在不同的线程中。

如果我移动代码 onCheckedChanged 方法(它在下面的代码 fragment 中有注释),应用程序将崩溃,提示我正在尝试从另一个线程更新 UI 线程。

public class MainActivity extends AppCompatActivity implements Handler.Callback {

private ToggleButton toggleButton;
private TextView textView;
private CameraController mTestCam;

//generate messages
private static final int MSG_OPEN_CAM = 0;
private static final int MSG_CLOSE_CAM = 1;
private static final int MSG_OPEN_FLASH= 2;
private static final int MSG_CLOSE_FLASH = 3;
//verify
private static final int MSG_OPEN_CAM_DONE = 4; // nu trebuie
private static final int MSG_CLOSE_CAM_DONE = 5;
private static final int MSG_OPEN_FLASH_DONE= 6;
private static final int MSG_CLOSE_FLASH_DONE= 7;

//used for MainActivity HandleMessage
protected Handler mHandler;

//camera controler thread
private CameraControllerThread mCameraControlThread;



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


//android marshmallow - in order for service to run you need runtime permissions
//testCam.openCamera(); //moved to method

toggleButton = (ToggleButton) findViewById(R.id.toggleButton);
textView = (TextView) findViewById(R.id.textView_text);

mHandler = new Handler(this);
mCameraControlThread = new CameraControllerThread("Camera Control Thread");
mCameraControlThread.start();

//moved to onStart
mTestCam = new CameraController();
Message openCameraMsg = mCameraControlThread.mWorkerHandler.obtainMessage(this.MSG_OPEN_CAM);
openCameraMsg.sendToTarget();


toggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {

if(isChecked){

mTestCam = new CameraController();
Message openCameraMsg = mCameraControlThread.mWorkerHandler
.obtainMessage(MSG_OPEN_CAM);
openCameraMsg.sendToTarget();

//mTestCam.openFlash();
} else {
//close flash
//mTestCam.stopFlash();
}

}
});

}

private void openCamera(){
synchronized (mTestCam){
mTestCam.openCamera();
}
Toast.makeText(this, "This is my text", Toast.LENGTH_LONG).show();
textView.setVisibility(View.VISIBLE);
textView.setText("Camera Open");
}

@Override
public boolean handleMessage(Message message) {
return false;
}


private class CameraControllerThread extends HandlerThread implements Handler.Callback{

protected Handler mWorkerHandler;

public CameraControllerThread(String name){
super(name);
}

@Override
protected void onLooperPrepared() {
mWorkerHandler = new Handler(getLooper(), this);
}

@Override
public boolean handleMessage(Message message) {

switch(message.what){
case MSG_OPEN_CAM:
openCamera();
break;
}

return true;
}
}
}

我想我的问题是 - 为什么如果我实例化我的 CameraController 并从 onCreate 发送消息 - 它允许我更新 UI - 以及当我执行onCheckedChangeListener 不允许我做同样的事情?

最佳答案

引用 Android documentation :

[Accessing the Android UI toolkit from outside the UI thread] can result in undefined and unexpected behavior, which can be difficult and time-consuming to track down.

任何事情都可能发生在竞争条件之后。

关于android - 为什么我的 HandlerThread 正在更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40532228/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com