您的位置:首页 > 理论基础 > 计算机网络

发生android.view.ViewRoot$CalledFromWrongThreadException异常的解决方案(转载http://daydayup1989.iteye.com/blog/784831)

2014-09-25 15:09 381 查看
在Android平台下,进行多线程编程时,经常需要在主线程之外的一个单独的线程中进行某些处理,然后更新用户界面显示。但是,在主线线程之外的线程中直接更新页面显示的问题是

报异常:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

【只有原始创建这个视图层次(view hierachy)的线程才能修改它的视图(view)】

也就是说必须在一般必须在程序的主线程(也就是ui)线程中进行更新界面显示的工作。可以采用下面的方法之一来解决:

法1:

在Activity.onCreate(Bundle savedInstanceState)中创建一个Handler类的实例, 在这个Handler实例的handleMessage回调函数中调用更新界面显示的函数。

Java代码


/**

* 启动线程用来刷新登录提示文字,N秒刷新一次

*

*/

private class FreshWordsThread extends Thread

{

@Override

public void run()

{

try

{

mLoadingWords = "test";

mLoadhandler.sendEmptyMessage(REFRESH);

}

catch (InterruptedException e)

{

e.printStackTrace();

Thread.currentThread().interrupt();

}

}

}

//主线程中的handler

class LoadHandler extends Handler

{

/**

* 接受子线程传递的消息机制

*/

@Override

public void handleMessage(Message msg)

{

super.handleMessage(msg);

int what = msg.what;

Log.i(TAG, "Main handler message code: " + what);

switch (what)

{

case REFRESH:

{

// 刷新页面的文字

mLoadingText.setText(mLoadingWords);

break;

}

}

}

}

法2:利用Activity.runOnUiThread(Runnable)把更新ui的代码创建在Runnable中,然后在需要更新ui时,把这个Runnable对象传给Activity.runOnUiThread(Runnable)。 这样Runnable对像就能在ui程序中被调用。

Java代码


FusionField.currentActivity.runOnUiThread(new Runnable()

{

public void run()

{

Toast.makeText(FusionField.currentActivity, "Success",

Toast.LENGTH_LONG).show();

}

});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐