16-07-24 android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that

来源:互联网 发布:java 启动main 编辑:程序博客网 时间:2024/05/18 00:02


今天在做ui测试时LogCat出现异常:


这里代码可能有点乱,有些其它知识点怕忘了加在里面:

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;@Overrideprotected 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被调用了");}@Overridepublic void onClick(View v){textview.setText("正在加载中...");Log.i("aa", "正在加载中...");Toast.makeText(getApplicationContext(), "密码验证中... ...", Toast.LENGTH_SHORT).show();// 匿名内部类,新建线程,调用了start方法new Thread(){@Overridepublic void run(){// 这是模拟一个耗时6秒的网络操作try{Thread.sleep(6000);}catch (InterruptedException e1){// TODO Auto-generated catch blocke1.printStackTrace();}try{textview.setText("第二次正在加载中...");}catch (Exception e){// TODO Auto-generated catch blocke.printStackTrace();}// Log.i("aa", "run被调用了");// Message msg = new Message();// myHandler.sendMessage(msg);}}.start();}public void test1(){Log.i("aa", "test1被调用了");}// 非静态内部类,能够调用外部类的成员方法与成员变量class MyHandler extends Handler{@Overridepublic 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(){@Overridepublic void run(){// 这是模拟一个耗时6秒的网络操作try{Thread.sleep(6000);}catch (InterruptedException e1){// TODO Auto-generated catch blocke1.printStackTrace();}Log.i("aa", "run被调用了");Message msg = new Message();myHandler.sendMessage(msg);}}.start();}// 非静态内部类,能够调用外部类的成员方法与成员变量class MyHandler extends Handler{@Overridepublic void handleMessage(Message msg){Toast.makeText(getApplicationContext(), "正在处理...", Toast.LENGTH_LONG).show();textview.setText("加载已完成");}}}






0 0