Android 的Thread编程,我在Thread的run()方法中用Toast输出信息时出错!
答案:5 悬赏:50 手机版
解决时间 2021-11-24 00:51
- 提问者网友:且恨且铭记
- 2021-11-23 07:00
Android 的Thread编程,我在Thread的run()方法中用Toast输出信息时出错!
最佳答案
- 五星知识达人网友:长青诗
- 2021-11-23 07:59
Toast.makeText(ThreadActivity.this, "toast", Toast.LENGTH_SHORT).show();
他是要再主线程中被调用,也就是ThreadActivity.this所在的线程中调用。
直接和context对应的。
简介:
编程是编写程序的中文简称,就是让计算机代为解决某个问题,对某个计算体系规定一定的运算方式,是计算体系按照该计算方式运行,并最终得到相应结果的过程。
为了使计算机能够理解人的意图,人类就必须将需解决的问题的思路、方法和手段通过计算机能够理解的形式告诉计算机,使得计算机能够根据人的指令一步一步去工作,完成某种特定的任务。这种人和计算体系之间交流的过程就是编程。
编程:设计具备逻辑流动作用的一种"可控体系"【注:编程不一定是针对计算机程序而言的,针对具备逻辑计算力的体系,都可以算编程。】
他是要再主线程中被调用,也就是ThreadActivity.this所在的线程中调用。
直接和context对应的。
简介:
编程是编写程序的中文简称,就是让计算机代为解决某个问题,对某个计算体系规定一定的运算方式,是计算体系按照该计算方式运行,并最终得到相应结果的过程。
为了使计算机能够理解人的意图,人类就必须将需解决的问题的思路、方法和手段通过计算机能够理解的形式告诉计算机,使得计算机能够根据人的指令一步一步去工作,完成某种特定的任务。这种人和计算体系之间交流的过程就是编程。
编程:设计具备逻辑流动作用的一种"可控体系"【注:编程不一定是针对计算机程序而言的,针对具备逻辑计算力的体系,都可以算编程。】
全部回答
- 1楼网友:鱼芗
- 2021-11-23 10:36
Thread必须自己重写Looper的两个函数才能调用回另一个线程追问不明白是什么意思?你可以在说清楚点嘛?
- 2楼网友:杯酒困英雄
- 2021-11-23 09:52
子线程中不能弹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();
}
主线程在 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();
}
- 3楼网友:深街酒徒
- 2021-11-23 08:41
不能在子线程中更新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我
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我
- 4楼网友:不如潦草
- 2021-11-23 08:28
请注意:Toast.makeText(ThreadActivity.this, "toast", Toast.LENGTH_SHORT).show();
他是要再主线程中被调用,也就是ThreadActivity.this所在的线程中调用。
直接和context对应的。追问那Handler与ThreadHandler线程绑定的后,就可以在ThreadHandler线程中用Toast显示,这个怎么解释呢?追答他是可以在子线程中通过handler发送到主线程显示。
他是要再主线程中被调用,也就是ThreadActivity.this所在的线程中调用。
直接和context对应的。追问那Handler与ThreadHandler线程绑定的后,就可以在ThreadHandler线程中用Toast显示,这个怎么解释呢?追答他是可以在子线程中通过handler发送到主线程显示。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯