16-07-24 android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that
2016-07-24 12:37
766 查看
今天在做ui测试时LogCat出现异常:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201607/60a84ae4163b290b6c178a06431b1d86)
这里代码可能有点乱,有些其它知识点怕忘了加在里面:
package com.example.test;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener
{
TextView textview;
EditText edittext;
Button button;
Handler myHandler;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myHandler = new MyHandler();
textview = (TextView) findViewById(R.id.text);
button = (Button) findViewById(R.id.button);
edittext = (EditText) findViewById(R.id.edittext);
button.setOnClickListener(this);
textview.setText("textview被调用了");
}
@Override
public void onClick(View v)
{
textview.setText("正在加载中...");
Log.i("aa", "正在加载中...");
Toast.makeText(getApplicationContext(), "密码验证中... ...", Toast.LENGTH_SHORT).show();
// 匿名内部类,新建线程,调用了start方法
new Thread()
{
@Override
public void run()
{
// 这是模拟一个耗时6秒的网络操作
try
{
Thread.sleep(6000);
}
catch (InterruptedException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
try
{
textview.setText("第二次正在加载中...");
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
// Log.i("aa", "run被调用了");
// Message msg = new Message();
// myHandler.sendMessage(msg);
}
}.start();
}
public void test1()
{
Log.i("aa", "test1被调用了");
}
// 非静态内部类,能够调用外部类的成员方法与成员变量
class MyHandler extends Handler
{
@Override
public void handleMessage(Message msg)
{
Toast.makeText(getApplicationContext(), "正在处理...", Toast.LENGTH_LONG).show();
test1();
textview.setText("加载已完成");
}
}
}
这里面发生异常的原因是因为在非主线程里做了关于ui的操作。主线程只能做ui相关的操作,主线程做耗时操作会造成ANR.传输数据,网络操作,io操作,算法等耗时长的操作需开新线程,避免主线程卡顿,发生ANR。
将上面的ui操作从非主线程里移出,并通过Handler传递结果给主线程来解决。
public void onClick(View v)
{
textview.setText("正在加载中...");
Log.i("aa", "正在加载中...");
Toast.makeText(getApplicationContext(), "密码验证中... ...", Toast.LENGTH_SHORT).show();
// 匿名内部类,新建线程,调用了start方法
new Thread()
{
@Override
public void run()
{
// 这是模拟一个耗时6秒的网络操作
try
{
Thread.sleep(6000);
}
catch (InterruptedException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
Log.i("aa", "run被调用了");
Message msg = new Message();
myHandler.sendMessage(msg);
}
}.start();
}
// 非静态内部类,能够调用外部类的成员方法与成员变量
class MyHandler extends Handler
{
@Override
public void handleMessage(Message msg)
{
Toast.makeText(getApplicationContext(), "正在处理...", Toast.LENGTH_LONG).show();
textview.setText("加载已完成");
}
}
}
这里代码可能有点乱,有些其它知识点怕忘了加在里面:
package com.example.test;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener
{
TextView textview;
EditText edittext;
Button button;
Handler myHandler;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myHandler = new MyHandler();
textview = (TextView) findViewById(R.id.text);
button = (Button) findViewById(R.id.button);
edittext = (EditText) findViewById(R.id.edittext);
button.setOnClickListener(this);
textview.setText("textview被调用了");
}
@Override
public void onClick(View v)
{
textview.setText("正在加载中...");
Log.i("aa", "正在加载中...");
Toast.makeText(getApplicationContext(), "密码验证中... ...", Toast.LENGTH_SHORT).show();
// 匿名内部类,新建线程,调用了start方法
new Thread()
{
@Override
public void run()
{
// 这是模拟一个耗时6秒的网络操作
try
{
Thread.sleep(6000);
}
catch (InterruptedException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
try
{
textview.setText("第二次正在加载中...");
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
// Log.i("aa", "run被调用了");
// Message msg = new Message();
// myHandler.sendMessage(msg);
}
}.start();
}
public void test1()
{
Log.i("aa", "test1被调用了");
}
// 非静态内部类,能够调用外部类的成员方法与成员变量
class MyHandler extends Handler
{
@Override
public void handleMessage(Message msg)
{
Toast.makeText(getApplicationContext(), "正在处理...", Toast.LENGTH_LONG).show();
test1();
textview.setText("加载已完成");
}
}
}
这里面发生异常的原因是因为在非主线程里做了关于ui的操作。主线程只能做ui相关的操作,主线程做耗时操作会造成ANR.传输数据,网络操作,io操作,算法等耗时长的操作需开新线程,避免主线程卡顿,发生ANR。
将上面的ui操作从非主线程里移出,并通过Handler传递结果给主线程来解决。
public void onClick(View v)
{
textview.setText("正在加载中...");
Log.i("aa", "正在加载中...");
Toast.makeText(getApplicationContext(), "密码验证中... ...", Toast.LENGTH_SHORT).show();
// 匿名内部类,新建线程,调用了start方法
new Thread()
{
@Override
public void run()
{
// 这是模拟一个耗时6秒的网络操作
try
{
Thread.sleep(6000);
}
catch (InterruptedException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
Log.i("aa", "run被调用了");
Message msg = new Message();
myHandler.sendMessage(msg);
}
}.start();
}
// 非静态内部类,能够调用外部类的成员方法与成员变量
class MyHandler extends Handler
{
@Override
public void handleMessage(Message msg)
{
Toast.makeText(getApplicationContext(), "正在处理...", Toast.LENGTH_LONG).show();
textview.setText("加载已完成");
}
}
}
相关文章推荐
- Android开发代号和对应API等级
- 【Android】子Fragment获取父Fragment
- Android应用程序获取system权限
- Android 4.4系统下LayoutParam使用
- android MVVM开发模式(二)
- 【Android】 获取当前系统语言
- Android获取屏幕尺寸的方法
- 新建android项目时,ActionBarActivity找不到
- bitmap 多级缓存
- Android使用Messenger实现进程间双向通信
- Android 下关于按键外部监视书写及布局
- Android重复闹钟(每天)的实现
- Android SQLite
- Android重复闹钟(每天)的实现 Android之AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作
- 百度阅读搜索_android
- Android Studio实用指南
- Android中处理崩溃异常 Android捕获全局异常信息并实现上传
- android studio 里面怎么把一个普通的module变为library类型的,
- android 标签标题固定页卡滑动效果
- android studio 经验