今天在做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("加载已完成");
}
}
}