最近在学习Android编程中遇到一个系统错误:android.os.NetworkOnMainThreadException,按字面意思理解就是在主线程上进行网络操作。既然不能在主线程上操作,那就在子线程上进行啊。由于之前没有写过java程序,于是就写了一个demo来进行测试,最终完成如下:
实现目的:
点击按钮,Textview显示ID值(ID值一秒更新一次);
界面:
一个Textview(我直接使用的helloworld的Textview)
一个Button
实现:
1、设置按钮监听:
button.setOnClickListener(new buttonOnclickListener());
2、监听(通过内部类实现):
public class buttonOnclickListener implements OnClickListener {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
isRunning=!isRunning;
changeID();
}
}
}
3、实现方法(changeID()):
private void changeID(){
Toast.makeText(getApplicationContext(), isRunning.toString(), Toast.LENGTH_SHORT).show();
new Thread(){
@Override
public void run(){
try {
while(isRunning)
{
Thread.currentThread().sleep(1000);
if (i<5000){
i+=1;
}else {
i=0;
}
Message msg=new Message();
msg.what=0;
msg.obj=i;
mHandler.sendMessage(msg);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
4、线程通信
private Handler mHandler=new Handler(){
public void handleMessage(Message msg){
String string=msg.obj.toString();
textView.setText(string);
}
};
5、运行界面如下:
6、完整代码如下:
package com.example.threaddemo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private Button button;
private TextView textView;
private Boolean isRunning=false;
//private Handler mHandler=new Handler();
private int i;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button=(Button)findViewById(R.id.button);
textView=(TextView)findViewById(R.id.txt_hello);
button.setOnClickListener(new buttonOnclickListener());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private void changeID(){
Toast.makeText(getApplicationContext(), isRunning.toString(), Toast.LENGTH_SHORT).show();
new Thread(){
@Override
public void run(){
try {
while(isRunning)
{
Thread.currentThread().sleep(1000);
if (i<5000){
i+=1;
}else {
i=0;
}
Message msg=new Message();
msg.what=0;
msg.obj=i;
mHandler.sendMessage(msg);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
private Handler mHandler=new Handler(){
public void handleMessage(Message msg){
String string=msg.obj.toString();
textView.setText(string);
}
};
public class buttonOnclickListener implements OnClickListener {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
isRunning=!isRunning;
changeID();
}
}
}
}