一,更新UI界面
1.1 基本修改组件内容
public class MainActivity extends Activity {
public TextView mTextTitle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextTitle = (TextView) findViewById(R.id._title);
mTextTitle.setText("HelloWorld");
}
}
|
布局文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>
|
在OnCreate()方式中通过mTextTitle.setText("HelloWorld");来修改组件内容。
1.2 子线程中修改UI界面
程序有时会通过线程来进行一些任务,同时需要将结果显示在UI界面。
public class MainActivity extends Activity {
public TextView mTextTitle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextTitle = (TextView) findViewById(R.id._title);
thread.start();
}
Thread thread = new Thread() {
@Override
public void run() {
int count = 0;
for (int i = 0; i < 10; i++) {
count ++;
}
mTextTitle.setText("Sum:" + count);
}
};
}
|
使用上面代码修改UI界面会报错。运行时提示错误:android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.解释:Android不允许在子线程修改UI界面,只允许在UI主线程修改UI界面。
1.3 使用Handler通过UI主线程修改界面
public class MainActivity extends Activity {
public static final int C_MSG = 100;
public TextView mTextTitle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextTitle = (TextView) findViewById(R.id._title);
thread.start();
}
Thread thread = new Thread() {
@Override
public void run() {
int count = 0;
for (int i = 0; i < 10; i++) {
count ++;
}
Message msg = Message.obtain();
msg.what = C_MSG;
msg.arg1 = count;
handler.sendMessage(msg);
// mTextTitle.setText("Sum:" + count);
}
};
Handler handler = new Handler(new Callback() {
@Override
public boolean handleMessage(Message msg) {
int what = msg.what;
switch (what) {
case C_MSG:
int count = msg.arg1;
mTextTitle.setText("Sum:" + count);
break;
}
return false;
}
});
}
|
根据如上代码:通过Handler和消息机制,在UI主线程中修改了TextView的内容。其中使用Handler和Message。有一点可以注意,Message的创建是使用Message msg = Message.obtain();为什么要这么过去对象?
1.4 其他修改UI界面方式
1.4.1 在子线程中通过runOnUiThread()方法更新UI
new Thread() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
mTextTitle.setText("HelloWorld--runOnUiThread");
}
});
}
}.start();
|
1.4.2 View.post(Runnable r)
mTextTitle.post(new Runnable() {
@Override
public void run() {
mTextView.setText("HelloWorld--View.post()");
}
});
|
分享到:
相关推荐
这种方法避免了在非UI线程直接操作UI组件导致的`CalledFromWrongThreadException`异常。 总结,Android中的进度条组件提供了丰富的功能,可以帮助开发者展示任务执行的状态。通过理解其基本使用、自定义样式以及...
先上结论 出现此问题的原因是:在非 UI 线程中创建了 Dialog,而在 UI 线程中调用了 show() 方法 问题还原 在使用 dialog 的时候,因为线程问题,在调用 dismiss() 方法...Caused by: android.view.ViewRootImpl$Called
在Android开发中,`android.view.ViewRootImpl$CalledFromWrongThreadException` 是一个常见的异常,它通常发生在尝试在非UI线程(主线程)中修改用户界面元素时。这个异常表明,只有创建视图的原始线程(即主线程)...
7. **ViewRoot$CalledFromWrongThreadException** 这个异常表示你尝试在非UI线程中修改视图组件。Android的UI操作必须在主线程(UI线程)中执行。如果你需要在其他线程中进行更新,可以使用 `runOnUiThread()` 或者...
注意,由于涉及到UI更新,必须确保这类操作在主线程中执行,如果在后台线程修改UI,Android系统会抛出`CalledFromWrongThreadException`异常。 在这个项目中,开发者可能还使用了Android Studio的一些其他功能,...
4. **运行时动态更新UI**:因为是运行时添加,所以需要确保所有操作都在UI线程上执行,否则可能会抛出`android.view.ViewRootImpl$CalledFromWrongThreadException`异常。可以使用`runOnUiThread()`或者`Handler`来...
所以,当`onReceive()`接收到网络状态变化时,应使用`runOnUiThread()`或`Handler`将更新UI的操作放在主线程中执行,以避免出现“CalledFromWrongThreadException”异常。 5. **权限申请**: - `INTERNET`权限:在...
- 数据加载和布局更新必须在主线程进行,否则会引发`CalledFromWrongThreadException`。 - 为了提高性能,避免在`onBindViewHolder`中进行耗时操作,如网络请求或复杂的图像处理。 - 使用`DiffUtil`可以提高数据更新...
例如,尝试在非UI线程中更新UI元素可能会导致`CalledFromWrongThreadException`异常。 #### 案例分析:天气查询应用 为了更好地理解Android线程模型的工作机制,我们可以通过一个简单的天气查询应用来探讨如何避免...
- **线程安全**:JavaScript调用Java方法时,由于执行在Web线程中,如果涉及到UI更新,必须使用`runOnUiThread()`确保操作在主线程执行,否则会抛出`CalledFromWrongThreadException`异常。 - **安全性**:出于...
否则,可能会引发“CalledFromWrongThreadException”异常。 4. **优化性能**:Android 4.4的WebView引入了硬件加速,这可能导致一些性能问题。可以通过`setLayerType(View.LAYER_TYPE_SOFTWARE, null)`来禁用硬件...
然而,Service通常运行在自己的工作线程中,这意味着在Service中直接使用Toast可能会导致`android.view.ViewRootImpl$CalledFromWrongThreadException`异常。为了解决这个问题,有以下两种常见方法: 1. 使用`...
由于Android系统的安全机制,所有与UI相关的操作必须在主线程中执行,因此我们不能在子线程中直接修改UI组件,否则会引发“CalledFromWrongThreadException”。 2. Handler(处理者): Handler是Android中用于在...
Android UI操作必须在主线程(UI线程)中执行,否则会抛出`android.view.ViewRootImpl$CalledFromWrongThreadException`异常。因此,在子线程中进行倒计时计算后,我们需要使用`Handler`或`runOnUiThread`来更新UI。...
如果试图在非UI线程中直接修改UI元素,会导致`android.view.ViewRoot$CalledFromWrongThreadException`异常。为了保证UI线程的流畅运行,避免长时间阻塞UI线程是非常重要的,因为一旦UI线程被长时间阻塞(例如超过5秒...
- 确保在主线程中更新Adapter,否则可能会抛出`CalledFromWrongThreadException`异常。 - 在数据更新后,调用`adapter.notifyDataSetChanged()`通知ListView数据已改变。 总结,Android中的ListView是一个强大且...
- **异常**:`CalledFromWrongThreadException`,表示试图从非主线程修改UI组件。 - **原因**:Android UI组件只能在主线程中被修改。 #### 16. 解决上述异常的方法 - **AsyncTask**:简化异步任务处理,自动在主线...
若试图在子线程中操作UI,系统会抛出`CalledFromWrongThreadException`异常。为了解决这个问题,Android提供了Handler、Message和Message Queue(消息队列)机制。Handler是线程间通信的一个关键组件,它可以发送和...