关于线程!!

glee10 2014-07-11 01:07:26
关于线程方面,我的代码如下,找不出什么不妥的地方,但虚拟器报错:”unfortrunly,XXX中止运行。”
求解!谢谢!
public class Start extends Activity implements Runnable{
private Thread thread; //声明线程对象
private int imgNum=1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//全屏模式,屏蔽一切标题
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.start);
thread=new Thread(Start.this); //创建一个线程
thread.start(); //开启线程
}
public void run() {
//获取动画资源
Animation anim_start=AnimationUtils.loadAnimation(this, R.anim.a_startalpha);
while(!Thread.currentThread().isInterrupted()&& imgNum<=3){
switch(imgNum){
case 1:
ImageView iv1=(ImageView)findViewById(R.id.start1);//获取要应用动画效果的ImageView
iv1.setBackgroundResource(R.drawable.start1);//取得第一幅背景图
iv1.startAnimation(anim_start); //开始播放第一幅
try {
thread.sleep(2000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
break;
case 2:
ImageView iv2=(ImageView)findViewById(R.id.start2);//获取要应用动画效果的ImageView
iv2.setBackgroundResource(R.drawable.start2);//取得第二幅背景图
iv2.startAnimation(anim_start); //开始播放第二幅
try {
thread.sleep(2000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
break;
case 3:
ImageView iv3=(ImageView)findViewById(R.id.start3);//获取要应用动画效果的ImageView
iv3.setBackgroundResource(R.drawable.start3);//取得第三幅背景图
iv3.startAnimation(anim_start); //开始播放第三幅
try {
thread.sleep(2000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
break;
default:
}
imgNum++;
}
}

protected void onDestroy() {
if(thread!=null){
thread.interrupt(); //中断线程
thread=null;
}
super.onDestroy();
}
}
...全文
333 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
asia_deng 2014-07-12
  • 打赏
  • 举报
回复
你这是定时设置背景? 在android里最好不用Thread的sleep方法,这个方法并不准时,可以使用Timer和TimerTask加上Handler来实现
glee10 2014-07-12
  • 打赏
  • 举报
回复
查出来是一个XML文件有点问题,解决后,发现上面的代码,只能循环显示最后一幅,是怎么回事呢?
glee10 2014-07-12
  • 打赏
  • 举报
回复
我后面的代码有什么问题呢? 求大侠指点!!!
glee10 2014-07-12
  • 打赏
  • 举报
回复
还是不行,请帮忙看下是什么问题。 这是error: 07-11 13:29:59.349: E/memtrack(1594): Couldn't load memtrack module (No such file or directory) 07-11 13:29:59.349: E/android.os.Debug(1594): failed to load memtrack module: -2 07-11 13:30:02.249: E/memtrack(1605): Couldn't load memtrack module (No such file or directory) 07-11 13:30:02.249: E/android.os.Debug(1605): failed to load memtrack module: -2 07-11 13:30:02.829: E/libEGL(51): called unimplemented OpenGL ES API 07-11 13:30:02.839: E/libEGL(51): called unimplemented OpenGL ES API 07-11 13:30:02.839: E/libEGL(51): called unimplemented OpenGL ES API 07-11 13:30:02.839: E/libEGL(51): called unimplemented OpenGL ES API 07-11 13:30:02.839: E/SurfaceFlinger(51): glCheckFramebufferStatusOES error -1293035039 07-11 13:30:02.839: E/SurfaceFlinger(51): got GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot 07-11 13:30:02.839: E/libEGL(51): called unimplemented OpenGL ES API 07-11 13:30:02.839: E/libEGL(51): called unimplemented OpenGL ES API 07-11 13:30:03.889: E/AndroidRuntime(1616): FATAL EXCEPTION: main 07-11 13:30:03.889: E/AndroidRuntime(1616): Process: com.zhutiansoft, PID: 1616 07-11 13:30:03.889: E/AndroidRuntime(1616): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.zhutiansoft/com.zhutiansoft.Start}: android.view.InflateException: Binary XML file line #9: Error inflating class android.widget.ImageView 07-11 13:30:03.889: E/AndroidRuntime(1616): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195) 07-11 13:30:03.889: E/AndroidRuntime(1616): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) 07-11 13:30:03.889: E/AndroidRuntime(1616): at android.app.ActivityThread.access$800(ActivityThread.java:135) 07-11 13:30:03.889: E/AndroidRuntime(1616): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 07-11 13:30:03.889: E/AndroidRuntime(1616): at android.os.Handler.dispatchMessage(Handler.java:102) 07-11 13:30:03.889: E/AndroidRuntime(1616): at android.os.Looper.loop(Looper.java:136) 07-11 13:30:03.889: E/AndroidRuntime(1616): at android.app.ActivityThread.main(ActivityThread.java:5017) 07-11 13:30:03.889: E/AndroidRuntime(1616): at java.lang.reflect.Method.invokeNative(Native Method) 07-11 13:30:03.889: E/AndroidRuntime(1616): at java.lang.reflect.Method.invoke(Method.java:515) 07-11 13:30:03.889: E/AndroidRuntime(1616): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 07-11 13:30:03.889: E/AndroidRuntime(1616): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 07-11 13:30:03.889: E/AndroidRuntime(1616): at dalvik.system.NativeStart.main(Native Method) 07-11 13:30:03.889: E/AndroidRuntime(1616): Caused by: android.view.InflateException: Binary XML file line #9: Error inflating class android.widget.ImageView 07-11 13:30:03.889: E/AndroidRuntime(1616): at android.view.LayoutInflater.createView(LayoutInflater.java:620) 07-11 13:30:03.889: E/AndroidRuntime(1616): at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) 07-11 13:30:03.889: E/AndroidRuntime(1616): at android.view.LayoutInflater.onCreateView(LayoutInflater.java:669) 07-11 13:30:03.889: E/AndroidRuntime(1616): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:694) 07-11 13:30:03.889: E/AndroidRuntime(1616): at android.view.LayoutInflater.rInflate(LayoutInflater.java:755) 07-11 13:30:03.889: E/AndroidRuntime(1616): at android.view.LayoutInflater.inflate(LayoutInflater.java:492) 07-11 13:30:03.889: E/AndroidRuntime(1616): at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 07-11 13:30:03.889: E/AndroidRuntime(1616): at android.view.LayoutInflater.inflate(LayoutInflater.java:353) 07-11 13:30:03.889: E/AndroidRuntime(1616): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:290) 07-11 13:30:03.889: E/AndroidRuntime(1616): at android.app.Activity.setContentView(Activity.java:1929) 07-11 13:30:03.889: E/AndroidRuntime(1616): at com.zhutiansoft.Start.onCreate(Start.java:29) 07-11 13:30:03.889: E/AndroidRuntime(1616): at android.app.Activity.performCreate(Activity.java:5231) 07-11 13:30:03.889: E/AndroidRuntime(1616): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 07-11 13:30:03.889: E/AndroidRuntime(1616): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159) 07-11 13:30:03.889: E/AndroidRuntime(1616): ... 11 more 07-11 13:30:03.889: E/AndroidRuntime(1616): Caused by: java.lang.reflect.InvocationTargetException 07-11 13:30:03.889: E/AndroidRuntime(1616): at java.lang.reflect.Constructor.constructNative(Native Method) 07-11 13:30:03.889: E/AndroidRuntime(1616): at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 07-11 13:30:03.889: E/AndroidRuntime(1616): at android.view.LayoutInflater.createView(LayoutInflater.java:594) 07-11 13:30:03.889: E/AndroidRuntime(1616): ... 24 more 07-11 13:30:03.889: E/AndroidRuntime(1616): Caused by: android.content.res.Resources$NotFoundException: File res/anim/a_start.xml from drawable resource ID #0x7f040004 07-11 13:30:03.889: E/AndroidRuntime(1616): at android.content.res.Resources.loadDrawable(Resources.java:2096) 07-11 13:30:03.889: E/AndroidRuntime(1616): at android.content.res.TypedArray.getDrawable(TypedArray.java:602) 07-11 13:30:03.889: E/AndroidRuntime(1616): at android.view.View.<init>(View.java:3554) 07-11 13:30:03.889: E/AndroidRuntime(1616): at android.widget.ImageView.<init>(ImageView.java:123) 07-11 13:30:03.889: E/AndroidRuntime(1616): at android.widget.ImageView.<init>(ImageView.java:119) 07-11 13:30:03.889: E/AndroidRuntime(1616): ... 27 more 07-11 13:30:03.889: E/AndroidRuntime(1616): Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #2: invalid drawable tag set 07-11 13:30:03.889: E/AndroidRuntime(1616): at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:933) 07-11 13:30:03.889: E/AndroidRuntime(1616): at android.graphics.drawable.Drawable.createFromXml(Drawable.java:877) 07-11 13:30:03.889: E/AndroidRuntime(1616): at android.content.res.Resources.loadDrawable(Resources.java:2092) 07-11 13:30:03.889: E/AndroidRuntime(1616): ... 31 more 07-11 13:30:11.629: E/SoundPool(383): error loading /system/media/audio/ui/Effect_Tick.ogg 07-11 13:30:11.639: E/SoundPool(383): error loading /system/media/audio/ui/Effect_Tick.ogg 07-11 13:30:11.639: E/SoundPool(383): error loading /system/media/audio/ui/Effect_Tick.ogg 07-11 13:30:11.639: E/SoundPool(383): error loading /system/media/audio/ui/Effect_Tick.ogg 07-11 13:30:11.639: E/SoundPool(383): error loading /system/media/audio/ui/Effect_Tick.ogg 07-11 13:30:11.639: E/SoundPool(383): error loading /system/media/audio/ui/KeypressStandard.ogg 07-11 13:30:11.649: E/SoundPool(383): error loading /system/media/audio/ui/KeypressSpacebar.ogg 07-11 13:30:11.649: E/SoundPool(383): error loading /system/media/audio/ui/KeypressDelete.ogg 07-11 13:30:11.649: E/SoundPool(383): error loading /system/media/audio/ui/KeypressReturn.ogg 07-11 13:30:11.649: E/SoundPool(383): error loading /system/media/audio/ui/KeypressInvalid.ogg 做得晕乎乎的。谢谢大家!!!
glee10 2014-07-12
  • 打赏
  • 举报
回复
有点明白了。手头的书对于这块讲得不够透,谢谢大家。 重做了一个: public class Start extends Activity { private Handler handler; // 声明一个Handler对象 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //全屏模式,屏蔽一切标题 requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.start); final ImageView iv_start=(ImageView)findViewById(R.id.start1);//获取要应用动画效果的ImageView final Animation anim_main=AnimationUtils.loadAnimation(this, R.anim.a_mainshowalpha); BitmapDrawable bitmapDrawable=(BitmapDrawable)iv_start.getDrawable(); //如果图片还未回收,则强制回收 if (bitmapDrawable !=null && !bitmapDrawable.getBitmap().isRecycled()){ bitmapDrawable.getBitmap().recycle(); } handler = new Handler() { @Override public void handleMessage(Message msg) { int num = 1; if (msg.what == 0x101) { //将要执行的操作写在线程对象的run方法当中 while(num<11){ switch(num){ case 1: iv_start.setBackgroundResource(R.drawable.start1); //设置背景 break; case 2: iv_start.setBackgroundResource(R.drawable.start2); //设置背景 break; case 3: iv_start.setBackgroundResource(R.drawable.start3); //设置背景 break; case 4: iv_start.setBackgroundResource(R.drawable.start4); //设置背景 break; case 5: iv_start.setBackgroundResource(R.drawable.start5); //设置背景 break; case 6: iv_start.setBackgroundColor(Color.BLACK); //设置背景清黑 break; case 7: iv_start.setBackgroundResource(R.drawable.start7); //设置背景 break; case 8: iv_start.setBackgroundResource(R.drawable.start8); //设置背景 break; case 9: iv_start.setBackgroundResource(R.drawable.start9); //设置背景 break; case 10: iv_start.setBackgroundResource(R.drawable.start10); //设置背景 break; } iv_start.startAnimation(anim_main); num++; } } super.handleMessage(msg); } }; Thread t = new Thread(new Runnable() { @Override public void run() { while (!Thread.currentThread().isInterrupted()) { Message m = handler.obtainMessage(); // 获取一个Message m.what = 0x101; // 设置消息标识 handler.sendMessage(m); // 发送消息 try { Thread.sleep(6000); // 休眠一段时间 } catch (InterruptedException e) { e.printStackTrace(); } } } }); t.start(); // 开启线程 } }
glee10 2014-07-12
  • 打赏
  • 举报
回复
引用 11 楼 asia_deng 的回复:
你这是定时设置背景? 在android里最好不用Thread的sleep方法,这个方法并不准时,可以使用Timer和TimerTask加上Handler来实现
谢谢!是想按顺序播放几幅图片透明度增加的动画,对时间要求不是太高。 关键我现在对于线程还不是太理解,所以有些吃力。希望大家能帮忙点拨一下,自己蒙着眼睛摸很困难。
glee10 2014-07-12
  • 打赏
  • 举报
回复
是有点头绪了,改了一下,觉得方法对了,但调试出错了: public class Start extends Activity { private Handler handler; // 声明一个Handler对象 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //全屏模式,屏蔽一切标题 requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.start); final ImageView iv_start=(ImageView)findViewById(R.id.start1);//获取要应用动画效果的ImageView final Animation anim_start=AnimationUtils.loadAnimation(this, R.anim.a_start); BitmapDrawable bitmapDrawable=(BitmapDrawable)iv_start.getDrawable(); //如果图片还未回收,则强制回收 if (bitmapDrawable !=null && !bitmapDrawable.getBitmap().isRecycled()){ bitmapDrawable.getBitmap().recycle(); } handler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == 0x101) { //将要执行的操作写在线程对象的run方法当中 while(msg.arg1<10){ switch(msg.arg1){ case 1: iv_start.setBackgroundResource(R.drawable.start1); //设置背景 iv_start.startAnimation(anim_start); break; case 2: iv_start.setBackgroundResource(R.drawable.start2); //设置背景 iv_start.startAnimation(anim_start); break; case 3: iv_start.setBackgroundResource(R.drawable.start3); //设置背景 iv_start.startAnimation(anim_start); break; case 4: iv_start.setBackgroundResource(R.drawable.start4); //设置背景 iv_start.startAnimation(anim_start); break; } } super.handleMessage(msg); } } }; Thread t = new Thread(new Runnable() { @Override public void run() { int num=0; while (!Thread.currentThread().isInterrupted()&&num<10) { num++; Message m = handler.obtainMessage(); // 获取一个Message m.what = 0x101; // 设置消息标识 m.arg1=num; handler.sendMessage(m); // 发送消息 try { Thread.sleep(2000); // 休眠一段时间 } catch (InterruptedException e) { e.printStackTrace(); } } } }); t.start(); // 开启线程 } }
老科达 2014-07-11
  • 打赏
  • 举报
回复
你在线程里面 执行各种UI操作。 Only the original thread that created a view hierarchy can touch its views.
妮_梦 2014-07-11
  • 打赏
  • 举报
回复
你在run对ui界面进行操作。你可以使用Handler
dali_yan 2014-07-11
  • 打赏
  • 举报
回复
在子线程里面是不允许更新主线程(UI线程)的,可以有几种解决方案: (1)Handler (2)AsyncTask<..> (3)Acivity.runOneUiThread(Runnable) (4) View.post(Runnable) (5)View.postDelayed(Runnable,long) 一般使用的是前面2中,你自己去网上找找资料,学习一下,没人会什么都帮你做好的。
落幕-无悔 2014-07-11
  • 打赏
  • 举报
回复
你更新UI不应该这样写 应该跳出来写个handler到主线程进行UI更新
卡卡的喵 2014-07-11
  • 打赏
  • 举报
回复
建议用AsyncTask来做
glee10 2014-07-11
  • 打赏
  • 举报
回复
logcat的error信息如下: 求指点: 07-10 12:51:49.800: E/memtrack(1403): Couldn't load memtrack module (No such file or directory) 07-10 12:51:49.800: E/android.os.Debug(1403): failed to load memtrack module: -2 07-10 12:52:02.260: E/memtrack(1444): Couldn't load memtrack module (No such file or directory) 07-10 12:52:02.260: E/android.os.Debug(1444): failed to load memtrack module: -2 07-10 12:52:02.930: E/libEGL(51): called unimplemented OpenGL ES API 07-10 12:52:02.930: E/libEGL(51): called unimplemented OpenGL ES API 07-10 12:52:02.940: E/libEGL(51): called unimplemented OpenGL ES API 07-10 12:52:02.940: E/libEGL(51): called unimplemented OpenGL ES API 07-10 12:52:02.940: E/SurfaceFlinger(51): glCheckFramebufferStatusOES error 943355648 07-10 12:52:02.940: E/SurfaceFlinger(51): got GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot 07-10 12:52:02.940: E/libEGL(51): called unimplemented OpenGL ES API 07-10 12:52:02.940: E/libEGL(51): called unimplemented OpenGL ES API 07-10 12:52:05.730: E/AndroidRuntime(1458): FATAL EXCEPTION: Thread-108 07-10 12:52:05.730: E/AndroidRuntime(1458): Process: com.zhutiansoft, PID: 1458 07-10 12:52:05.730: E/AndroidRuntime(1458): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 07-10 12:52:05.730: E/AndroidRuntime(1458): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6094) 07-10 12:52:05.730: E/AndroidRuntime(1458): at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:824) 07-10 12:52:05.730: E/AndroidRuntime(1458): at android.view.View.requestLayout(View.java:16431) 07-10 12:52:05.730: E/AndroidRuntime(1458): at android.view.View.requestLayout(View.java:16431) 07-10 12:52:05.730: E/AndroidRuntime(1458): at android.view.View.requestLayout(View.java:16431) 07-10 12:52:05.730: E/AndroidRuntime(1458): at android.view.View.requestLayout(View.java:16431) 07-10 12:52:05.730: E/AndroidRuntime(1458): at android.view.View.requestLayout(View.java:16431) 07-10 12:52:05.730: E/AndroidRuntime(1458): at android.view.View.setBackgroundDrawable(View.java:15423) 07-10 12:52:05.730: E/AndroidRuntime(1458): at android.view.View.setBackground(View.java:15322) 07-10 12:52:05.730: E/AndroidRuntime(1458): at android.view.View.setBackgroundResource(View.java:15305) 07-10 12:52:05.730: E/AndroidRuntime(1458): at com.zhutiansoft.Start.run(Start.java:36) 07-10 12:52:05.730: E/AndroidRuntime(1458): at java.lang.Thread.run(Thread.java:841) 07-10 12:52:05.810: E/libEGL(51): called unimplemented OpenGL ES API 07-10 12:52:05.810: E/libEGL(51): called unimplemented OpenGL ES API 07-10 12:52:05.810: E/libEGL(51): called unimplemented OpenGL ES API 07-10 12:52:05.810: E/libEGL(51): called unimplemented OpenGL ES API 07-10 12:52:05.820: E/SurfaceFlinger(51): glCheckFramebufferStatusOES error 943355648 07-10 12:52:05.820: E/SurfaceFlinger(51): got GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot 07-10 12:52:05.820: E/libEGL(51): called unimplemented OpenGL ES API 07-10 12:52:05.820: E/libEGL(51): called unimplemented OpenGL ES API
maginawin 2014-07-11
  • 打赏
  • 举报
回复
你不要 implements Runnable, 自己去类里面 Runnable runnable = new Runnable(){ ...} 不能在主线程里面更新UI, 必须要一个新的线程 可以用new Thread() 也可以用 Handler handler = new Handler(); handler.post(Runnable runnable) OR handler.postDelay(runnable, int i);

80,350

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧