`
gogoalong
  • 浏览: 49732 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

Android:CalledFromWrongThreadException

 
阅读更多

一,更新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()");
	}
});



分享到:
评论

相关推荐

    Android进度条实例

    这种方法避免了在非UI线程直接操作UI组件导致的`CalledFromWrongThreadException`异常。 总结,Android中的进度条组件提供了丰富的功能,可以帮助开发者展示任务执行的状态。通过理解其基本使用、自定义样式以及...

    【Android】CalledFromWrongThreadException 深入源码分析

    先上结论 出现此问题的原因是:在非 UI 线程中创建了 Dialog,而在 UI 线程中调用了 show() 方法 问题还原 在使用 dialog 的时候,因为线程问题,在调用 dismiss() 方法...Caused by: android.view.ViewRootImpl$Called

    问题:android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original

    在Android开发中,`android.view.ViewRootImpl$CalledFromWrongThreadException` 是一个常见的异常,它通常发生在尝试在非UI线程(主线程)中修改用户界面元素时。这个异常表明,只有创建视图的原始线程(即主线程)...

    android平台初级错误整理

    7. **ViewRoot$CalledFromWrongThreadException** 这个异常表示你尝试在非UI线程中修改视图组件。Android的UI操作必须在主线程(UI线程)中执行。如果你需要在其他线程中进行更新,可以使用 `runOnUiThread()` 或者...

    帧布局例程

    注意,由于涉及到UI更新,必须确保这类操作在主线程中执行,如果在后台线程修改UI,Android系统会抛出`CalledFromWrongThreadException`异常。 在这个项目中,开发者可能还使用了Android Studio的一些其他功能,...

    安卓Android源码——点按钮添加TableRow源码.zip

    4. **运行时动态更新UI**:因为是运行时添加,所以需要确保所有操作都在UI线程上执行,否则可能会抛出`android.view.ViewRootImpl$CalledFromWrongThreadException`异常。可以使用`runOnUiThread()`或者`Handler`来...

    Android-NetMonitor使用广播监听网络变化更新UI

    所以,当`onReceive()`接收到网络状态变化时,应使用`runOnUiThread()`或`Handler`将更新UI的操作放在主线程中执行,以避免出现“CalledFromWrongThreadException”异常。 5. **权限申请**: - `INTERNET`权限:在...

    RecyclerViewDemo瀑布流

    - 数据加载和布局更新必须在主线程进行,否则会引发`CalledFromWrongThreadException`。 - 为了提高性能,避免在`onBindViewHolder`中进行耗时操作,如网络请求或复杂的图像处理。 - 使用`DiffUtil`可以提高数据更新...

    浅谈android线程模型

    例如,尝试在非UI线程中更新UI元素可能会导致`CalledFromWrongThreadException`异常。 #### 案例分析:天气查询应用 为了更好地理解Android线程模型的工作机制,我们可以通过一个简单的天气查询应用来探讨如何避免...

    android JS与java代码相互调用

    - **线程安全**:JavaScript调用Java方法时,由于执行在Web线程中,如果涉及到UI更新,必须使用`runOnUiThread()`确保操作在主线程执行,否则会抛出`CalledFromWrongThreadException`异常。 - **安全性**:出于...

    android4.4 webview js交互冲突

    否则,可能会引发“CalledFromWrongThreadException”异常。 4. **优化性能**:Android 4.4的WebView引入了硬件加速,这可能导致一些性能问题。可以通过`setLayerType(View.LAYER_TYPE_SOFTWARE, null)`来禁用硬件...

    android service toast 01

    然而,Service通常运行在自己的工作线程中,这意味着在Service中直接使用Toast可能会导致`android.view.ViewRootImpl$CalledFromWrongThreadException`异常。为了解决这个问题,有以下两种常见方法: 1. 使用`...

    android demo,实现主线程handle,工作子线程threadHandle的处理

    由于Android系统的安全机制,所有与UI相关的操作必须在主线程中执行,因此我们不能在子线程中直接修改UI组件,否则会引发“CalledFromWrongThreadException”。 2. Handler(处理者): Handler是Android中用于在...

    android的倒计时功能

    Android UI操作必须在主线程(UI线程)中执行,否则会抛出`android.view.ViewRootImpl$CalledFromWrongThreadException`异常。因此,在子线程中进行倒计时计算后,我们需要使用`Handler`或`runOnUiThread`来更新UI。...

    android课件

    如果试图在非UI线程中直接修改UI元素,会导致`android.view.ViewRoot$CalledFromWrongThreadException`异常。为了保证UI线程的流畅运行,避免长时间阻塞UI线程是非常重要的,因为一旦UI线程被长时间阻塞(例如超过5秒...

    Android中ListView的用法

    - 确保在主线程中更新Adapter,否则可能会抛出`CalledFromWrongThreadException`异常。 - 在数据更新后,调用`adapter.notifyDataSetChanged()`通知ListView数据已改变。 总结,Android中的ListView是一个强大且...

    Android面试系列—目录

    - **异常**:`CalledFromWrongThreadException`,表示试图从非主线程修改UI组件。 - **原因**:Android UI组件只能在主线程中被修改。 #### 16. 解决上述异常的方法 - **AsyncTask**:简化异步任务处理,自动在主线...

    Android多线程处理[参考].pdf

    若试图在子线程中操作UI,系统会抛出`CalledFromWrongThreadException`异常。为了解决这个问题,Android提供了Handler、Message和Message Queue(消息队列)机制。Handler是线程间通信的一个关键组件,它可以发送和...

Global site tag (gtag.js) - Google Analytics