您的位置:首页 > 移动开发 > Android开发

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

2016-07-24 12:37 766 查看
今天在做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;

@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("加载已完成");

}

}

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