大神救命啊 android线程间通信 handler message之类的 30
publicclassThreadTestActivityextendsActivity{/**Calledwhentheactivityisfirstcreated.*...
public class ThreadTestActivity extends Activity {
/** Called when the activity is first created. */
public TextView tv;
private Button b1,b2,b3;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv=(TextView)findViewById(R.id.tv);
b1=(Button)findViewById(R.id.thread1);
b2=(Button)findViewById(R.id.thread2);
b3=(Button)findViewById(R.id.thread3);
b1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
LooperThread loop=new LooperThread();
loop.start();
Handler handler=new Handler(Looper.getMainLooper());
Message msg=handler.obtainMessage();
Bundle data=new Bundle();
data=msg.getData();
String str[]=data.getStringArray("thread1");
tv.setText(str[0]);
}
});
b2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
tv.setText("thread2");
}
});
}
class LooperThread extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
Handler handler=new Handler(Looper.getMainLooper());
Message msg=handler.obtainMessage();
Bundle data=new Bundle();
data.putStringArray("thread1", new String[]{"i am the thead1"});
msg.setData(data);
handler.sendMessage(msg);
}
}
}
.........最后在tv.setText("thread2");报了个空指针错误
还有..有几个问题
1:因为UI线程自己产生一个Message Queue..自定义的线程里面用Looper.prepare()长生Message Queue....但是自定义的线程放到UI线程里面用就会说一个线程只能有一个looper...怎么解析呢
2:用Looper.getMainLooper()和Looper.myLooper()...怎么上面都不起作用呢...还有Looper.myLooper()不会获取UI创建的那个消息队列里面的消息么..还是只会对自定义的线程有效..好乱啊..
3:如果用AsyncTask来实现是比较清晰 和直接继承一个Thread的线程有什么区别呢..
可以给出个线程间通信的例子么thread1和thread2之间..它们都extends Thread的
不够分可以再加..不想再被折磨啦 展开
/** Called when the activity is first created. */
public TextView tv;
private Button b1,b2,b3;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv=(TextView)findViewById(R.id.tv);
b1=(Button)findViewById(R.id.thread1);
b2=(Button)findViewById(R.id.thread2);
b3=(Button)findViewById(R.id.thread3);
b1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
LooperThread loop=new LooperThread();
loop.start();
Handler handler=new Handler(Looper.getMainLooper());
Message msg=handler.obtainMessage();
Bundle data=new Bundle();
data=msg.getData();
String str[]=data.getStringArray("thread1");
tv.setText(str[0]);
}
});
b2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
tv.setText("thread2");
}
});
}
class LooperThread extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
Handler handler=new Handler(Looper.getMainLooper());
Message msg=handler.obtainMessage();
Bundle data=new Bundle();
data.putStringArray("thread1", new String[]{"i am the thead1"});
msg.setData(data);
handler.sendMessage(msg);
}
}
}
.........最后在tv.setText("thread2");报了个空指针错误
还有..有几个问题
1:因为UI线程自己产生一个Message Queue..自定义的线程里面用Looper.prepare()长生Message Queue....但是自定义的线程放到UI线程里面用就会说一个线程只能有一个looper...怎么解析呢
2:用Looper.getMainLooper()和Looper.myLooper()...怎么上面都不起作用呢...还有Looper.myLooper()不会获取UI创建的那个消息队列里面的消息么..还是只会对自定义的线程有效..好乱啊..
3:如果用AsyncTask来实现是比较清晰 和直接继承一个Thread的线程有什么区别呢..
可以给出个线程间通信的例子么thread1和thread2之间..它们都extends Thread的
不够分可以再加..不想再被折磨啦 展开
2个回答
展开全部
线程间通讯(三种方式)::
public class AnrActivity extends Activity implements OnClickListener {
TextView text;
Handler handler;
ProgressBar bar;
private class MyAsycnTask extends AsyncTask<URL, Integer, String>{
@Override
protected void onProgressUpdate(Integer... values) {
bar.setProgress(values[0]);
text.setText("进度:"+values[0]+"%");
super.onProgressUpdate(values);
}
@Override
protected String doInBackground(URL... params) {
for (int i = 0; i <100; i++) {
try {
publishProgress(i+1);
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return "success";
}
@Override
protected void onPostExecute(String result) {
text.setText(result);
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button down = (Button) this.findViewById(R.id.button1);
Button receiver = (Button) this.findViewById(R.id.button2);
Button update = (Button)this.findViewById(R.id.button3);
bar = (ProgressBar)this.findViewById(R.id.progressBar1);
text = (TextView)this.findViewById(R.id.text);
update.setOnClickListener(this);
down.setOnClickListener(this);
receiver.setOnClickListener(this);
}
@Override
public void onClick(final View v) {
switch (v.getId()) {
case R.id.button1:
//通过 Asycntask 进行通讯
MyAsycnTask myAsycnTask = new MyAsycnTask();
myAsycnTask.execute(null);
break;
case R.id.button2:
//通过发送通知进行通讯
Intent intent = new Intent();
intent.putExtra("test", "receiver");
intent.setAction("com.tarena.test");
sendBroadcast(intent);//发送通知
break;
case R.id.button3:
// 通过 new Thread()或者runOnUiThread()或者Handler 实现
new Thread(){
public void run() {
CommontUtils.timeConsuming(2);
Runnable action = new Runnable() {
@Override
public void run() {
Toast.makeText(AnrActivity.this, "update_success", 0).show();
text.setText("update_success");
}
};
//runOnUiThread(action);
//handler.post(action);
v.post(action);
}
}.start();
break;
public class AnrActivity extends Activity implements OnClickListener {
TextView text;
Handler handler;
ProgressBar bar;
private class MyAsycnTask extends AsyncTask<URL, Integer, String>{
@Override
protected void onProgressUpdate(Integer... values) {
bar.setProgress(values[0]);
text.setText("进度:"+values[0]+"%");
super.onProgressUpdate(values);
}
@Override
protected String doInBackground(URL... params) {
for (int i = 0; i <100; i++) {
try {
publishProgress(i+1);
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return "success";
}
@Override
protected void onPostExecute(String result) {
text.setText(result);
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button down = (Button) this.findViewById(R.id.button1);
Button receiver = (Button) this.findViewById(R.id.button2);
Button update = (Button)this.findViewById(R.id.button3);
bar = (ProgressBar)this.findViewById(R.id.progressBar1);
text = (TextView)this.findViewById(R.id.text);
update.setOnClickListener(this);
down.setOnClickListener(this);
receiver.setOnClickListener(this);
}
@Override
public void onClick(final View v) {
switch (v.getId()) {
case R.id.button1:
//通过 Asycntask 进行通讯
MyAsycnTask myAsycnTask = new MyAsycnTask();
myAsycnTask.execute(null);
break;
case R.id.button2:
//通过发送通知进行通讯
Intent intent = new Intent();
intent.putExtra("test", "receiver");
intent.setAction("com.tarena.test");
sendBroadcast(intent);//发送通知
break;
case R.id.button3:
// 通过 new Thread()或者runOnUiThread()或者Handler 实现
new Thread(){
public void run() {
CommontUtils.timeConsuming(2);
Runnable action = new Runnable() {
@Override
public void run() {
Toast.makeText(AnrActivity.this, "update_success", 0).show();
text.setText("update_success");
}
};
//runOnUiThread(action);
//handler.post(action);
v.post(action);
}
}.start();
break;
追问
能解析一下我错在哪里么 谢谢
追答
mainLooper = Looper.myLooper();
Looper.prepare();
Handler handler=new Handler(mainLooper);
Message msg=handler.obtainMessage();
Bundle data=new Bundle();
data=msg.getData();
String str[]=data.getStringArray("thread1");
tv.setText(str[0]);
Looper.loop();
在handler之前一定要Looper.prepare();
在handler完成之后一定要Looper.loop();
展开全部
你在b1的点击事件里new了一个和主线程通信的handler,然后在LooperThread 里也new了一个和主线程通信的handler,虽然都是和主线程通信,但是这是两个不同的handler,相当于handler1和handler2,handler1只能处理handler1发送的消息,handler2只能处理handler2发送的消息。你现在是在LooperThread 里面的handler发送的消息,然后在b1的点击事件的handler里面处理消息,很明显LooperThread 里面handler发送的消息不会传到b1点击事件的handler里面来处理。你可以在LooperThread 里面new handler的时候实现handleMessage来验证一下。
要想达到你的目的的话,你可以在外面new一个handler,然后在b1的点击事件和LooperThread 里面都调用这个handler就行了。
而且还有个关键的,Message msg=handler.obtainMessage();这个只是说创建一个和handler相关的空的msg,不是说从消息队列中得到一个和handler相关的msg,一般这个后面都是设置一些msg的参数,然后send,你在b1里面相当于是创建了一个空的msg,然后从这个空的msg里面拿data,肯定也是空的。
一般要处理handler发送的消息,都是在new handler的时候实现它的handleMessage方法,然后在这里执行你收到消息后的操作。
要想达到你的目的的话,你可以在外面new一个handler,然后在b1的点击事件和LooperThread 里面都调用这个handler就行了。
而且还有个关键的,Message msg=handler.obtainMessage();这个只是说创建一个和handler相关的空的msg,不是说从消息队列中得到一个和handler相关的msg,一般这个后面都是设置一些msg的参数,然后send,你在b1里面相当于是创建了一个空的msg,然后从这个空的msg里面拿data,肯定也是空的。
一般要处理handler发送的消息,都是在new handler的时候实现它的handleMessage方法,然后在这里执行你收到消息后的操作。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询