安卓handler使用(不使用Message与没有复写Handler)
使用handler随机显示图片
2秒后只运行一次
下面的例子中只随机显示一次
package com.linyb.timer;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ImageView;
import java.util.Random;
public class MainActivity extends AppCompatActivity {
ImageView imageView;
int[] ImageArray = new int[]{R.mipmap.aaa, R.mipmap.bbb, R.mipmap.ccc, R.mipmap.ic_launcher_round, R.mipmap.ic_launcher};
int i = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.image);
final Random random = new Random();
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
imageView.setImageResource(ImageArray[random.nextInt(5)]);//产生0-4的随机数,不包括5 )
Log.d("in handler", "run: 3");
}
}, 2000);
Log.d("not in handler", "run:out handler");
}
}
开始后3秒换图片,之后就2秒后换
package com.linyb.timer;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
import java.util.Random;
public class MainActivity extends AppCompatActivity{
ImageView imageView;
int[] ImageArray = new int[]{R.mipmap.aaa, R.mipmap.bbb, R.mipmap.ccc, R.mipmap.ic_launcher_round, R.mipmap.ic_launcher};
final Random random = new Random();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.image);
final Handler handler2 = new Handler();
handler2.postDelayed(new Runnable() {
@Override
public void run() {
handler2.postDelayed(this,2000);
imageView.setImageResource(ImageArray[random.nextInt(5)]);//产生0-4的随机数,不包括5 )
}
}, 3000);
}
}
算是一种错误的写法
package com.linyb.timer;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ImageView;
import java.util.Random;
public class MainActivity extends AppCompatActivity{
ImageView imageView;
int[] ImageArray = new int[]{R.mipmap.aaa, R.mipmap.bbb, R.mipmap.ccc, R.mipmap.ic_launcher_round, R.mipmap.ic_launcher};
final Handler handler2 = new Handler();
final Random random = new Random();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.image);
handler2.postDelayed(new Runnable() {
@Override
public void run() {
handler2.postDelayed(this,2000);
imageView.setImageResource(ImageArray[random.nextInt(5)]);//产生0-4的随机数,不包括5 )
handler2.postDelayed(this,5000);
Log.d("run", "run: "+handler2.toString());
}
}, 3000);
}
//要加上不然返回键还在运行
@Override
protected void onDestroy() {
super.onDestroy();
System.exit(0);
}
}
会出现ANR,不过不确定出现ANR原因是不是因为下面这样解释
这种写法的后果是:运行后
3秒后设置当前的handle为每2秒运行一次
并更改图片
再将当前的handle为每2秒运行一次
这个每5秒运行一次
跑久了后相当于handle是不停运行的,将出现ANR