永发信息网

Android 的Thread编程,我在Thread的run()方法中用Toast输出信息时出错!

答案:5  悬赏:50  手机版
解决时间 2021-11-24 00:51
Android 的Thread编程,我在Thread的run()方法中用Toast输出信息时出错!
最佳答案
Toast.makeText(ThreadActivity.this, "toast", Toast.LENGTH_SHORT).show();
他是要再主线程中被调用,也就是ThreadActivity.this所在的线程中调用。
直接和context对应的。
简介:
编程是编写程序的中文简称,就是让计算机代为解决某个问题,对某个计算体系规定一定的运算方式,是计算体系按照该计算方式运行,并最终得到相应结果的过程。
为了使计算机能够理解人的意图,人类就必须将需解决的问题的思路、方法和手段通过计算机能够理解的形式告诉计算机,使得计算机能够根据人的指令一步一步去工作,完成某种特定的任务。这种人和计算体系之间交流的过程就是编程。
编程:设计具备逻辑流动作用的一种"可控体系"【注:编程不一定是针对计算机程序而言的,针对具备逻辑计算力的体系,都可以算编程。】
全部回答
Thread必须自己重写Looper的两个函数才能调用回另一个线程追问不明白是什么意思?你可以在说清楚点嘛?
子线程中不能弹Toast,不能更新UI,你可以在子线程中使用Handler回调,在主线程中弹Toast,可以这样写:

主线程在 onCreate方法之外:
Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
Toast.makeText(ThreadActivity.this, "toast", Toast.LENGTH_SHORT).show();
break;
}
super.handleMessage(msg);
}
};

子线程:
try {
Thread.sleep(5000);
Message msg = new Message();
msg.what = 1;
mHandler.sendMessage(msg);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
不能在子线程中更新UI,这是我之前写的一个例子,你看看,使用Handler消息机制

public class HandlerDemoActivity extends Activity implements OnClickListener {
Button btn1,btn2;
ProgressBar progressBar;
UpdateDataHandler updateDataHandler;
HandlerThread handlerThread;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn1 = (Button)findViewById(R.id.btn1);
btn2 = (Button)findViewById(R.id.btn2);
progressBar = (ProgressBar)findViewById(R.id.progressBar1);
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);

}

class UpdateDataHandler extends Handler{

public UpdateDataHandler(Looper looper){
super(looper);
}

@Override
public void handleMessage(Message msg) {

super.handleMessage(msg);

System.out.println("----------" + Thread.currentThread().getId());
progressBar.setProgress(msg.arg1); //从消息队列中取出数据,并更新控件
updateDataHandler.post(printRunnable);
}
}

Runnable printRunnable = new Runnable() {//实现一个线程类
int i = 0;
@Override
public void run() { //重写线程类中的run函数
i += 20;
Message msg = updateDataHandler.obtainMessage(); //获得handler的message对象
msg.arg1=i; //向message对象中放置数据
//msg.obj = obj;//还可以发送一些对象
//msg.setData();//可以发送Bundle对象
try {
Thread.sleep(1000); //暂停1秒钟
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(i);
if(i > 100) //判断当变量到达100时,操作结束
{
updateDataHandler.removeCallbacks(printRunnable);//从handler中释放线程类
return;
}
//msg.sendToTarget(); //使用此函数也可以实现发送消息
updateDataHandler.sendMessage(msg); //将message对象放到消息队列中
}
};

@Override
public void onClick(View v) {
if(v == btn1)
{
handlerThread = new HandlerThread("");// HandlerThread是一个Thread,继承自Thread。它保留着对Looper实例的引用
handlerThread.start(); //一定要调用线程的start函数
updateDataHandler = new UpdateDataHandler(handlerThread.getLooper());
updateDataHandler.post(printRunnable);
System.out.println("主线程" + Thread.currentThread().getId());

}
}
}追问如果我的线程是Thread,那我该怎么用Looper()来让Thread和Handler困绑?追答如果这样,你可以使用handlerThread方式启动一个线程,然后继承Handler 实现带有Looper的构造函数。
上边的代码已经写的很详细了,你耐心看看,会明白的,不明白在hi我
请注意:Toast.makeText(ThreadActivity.this, "toast", Toast.LENGTH_SHORT).show();
他是要再主线程中被调用,也就是ThreadActivity.this所在的线程中调用。
直接和context对应的。追问那Handler与ThreadHandler线程绑定的后,就可以在ThreadHandler线程中用Toast显示,这个怎么解释呢?追答他是可以在子线程中通过handler发送到主线程显示。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
怎么看色环电阻是多少W的
请问是谁将工业工程引入中国的?我记得好像是
在英语考试中,“ April 18th”中, th能不能省
什么是我国古代用来观测太阳月球和星星的
从浩方进入魔兽争霸就无法调整亮度!但是单打
oppo105d当dac用怎麼样
黑麦米可以跟小米黑米小麦一起煮吗?
请问谁知道园大的机器人除了餐厅可以用,还有
草菇为什么那么难种植
珊瑚的功效
为什么火车是国家的,私人不能承包呢?
光是否有重量
你有喜欢的人吗?
最疼的刑法?
焉耆有什么好玩的地方
推荐资讯
金邦U盘和金斯顿U盘哪个好
卧室落地窗户适合用哪种窗帘
樱花落海洋2求里面表白句子
亚洲史的中文序言
纯锡多少钱一斤
有月老的身世么?
有句话叫什么来着不能双得就是你又想得到这个
若单相半波整流电路中的二极管接反,则将产生
来伊份官网可以申请会员吗?
《不思议迷宫》沙漠绿洲不许愿攻略介绍
萨尔与塔雷沙的故事
买房了有哪些楼层忌讳
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?