这段代码为什么不报错(android 其他线程访问UI线程对象问题)

lieying1946 2016-04-23 11:20:12
为什么 mRoundProgressBar1 可以再子线程中访问得到,而且程序不报错,而且testInt 也可以访问得到?

网上不是说

Android的UI更新只能在UI线程中,即主线程。子线程中如果要进行UI更新,都是要通知主线程来进行。
几种实现方式总结如下,欢迎补充。
1、runOnUiThread()
子线程中持有当前Activity引用(假如为Activity mActivity;),即可以调用mActivity的runOnUiThread(Runnable r)方法。
2、post()和postDelay()
子线程如果持有某个View的引用,要对该View进行更新,则可调用该View对象的post(Runnable r)或postDelay(Runnable r)方法
Handler对象也有post()方法。其实在Android的源码中,这些post()方法都是借助下面的第3种方法:Handler + Message来实现的。
3、Handler + Message或者Handler + Thread + Message
参考

为什么 我这里的


package com.example.roundprogressbar;
package com.example.roundprogressbar;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

import com.example.circlepregress.R;

public class MainActivity extends Activity {
private RoundProgressBar mRoundProgressBar1, mRoundProgressBar1_,
mRoundProgressBar2, mRoundProgressBar3, mRoundProgressBar4,
mRoundProgressBar5;
private int progress = 0, testInt = 19;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cricle_progress);

mRoundProgressBar1 = (RoundProgressBar) findViewById(R.id.roundProgressBar1);
mRoundProgressBar2 = (RoundProgressBar) findViewById(R.id.roundProgressBar2);
mRoundProgressBar3 = (RoundProgressBar) findViewById(R.id.roundProgressBar3);
mRoundProgressBar4 = (RoundProgressBar) findViewById(R.id.roundProgressBar4);
mRoundProgressBar5 = (RoundProgressBar) findViewById(R.id.roundProgressBar5);
testInt = 20;
Log.w("test12", String.valueOf(testInt));
((Button) findViewById(R.id.button1))
.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
testInt = 21;
new Thread(new Runnable() {

@Override
public void run() {

new Thread(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub

new Thread(new Runnable() {

@Override
public void run() {
while (progress <= 100) {
progress += 3;

// System.out.println(progress);
Log.w("test1", String
.valueOf(testInt));

mRoundProgressBar1
.setProgress(progress);
mRoundProgressBar2
.setProgress(progress);
mRoundProgressBar3
.setProgress(progress);
mRoundProgressBar4
.setProgress(progress);
mRoundProgressBar5
.setProgress(progress);

try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}
}).start();
}

}).start();
}
}).start();
}
});

}
}



这下面是我的测试代码,下面mInt就不行

package cn.sunzn.tevent;

class demo1 {
String name = "a";
int age = 33;

public String getName(){
return this.name;
}
}

public class demo {
public int mInt;

public static void main(String args[]) {
mInt=22;
new Thread(new Runnable() {
public void run() {
System.out.print(mInt);
}
}).run();

}
}



...全文
210 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
forrg 2016-04-27
  • 打赏
  • 举报
回复
记得安卓2.几 的时候只是给个建议不要这样做,实际是可以的,后来才改的,看你的环境
KM_whty 2016-04-26
  • 打赏
  • 举报
回复
ViewRoot还没有创建,不检测是否在子线程中执行

786

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 非技术区
android小程序微信小程序 技术论坛(原bbs)
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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