大神救命啊 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的

不够分可以再加..不想再被折磨啦
展开
 我来答
android小将
2012-03-20 · TA获得超过368个赞
知道小有建树答主
回答量:142
采纳率:100%
帮助的人:130万
展开全部
线程间通讯(三种方式)::
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();
l8023y
2012-12-04
知道答主
回答量:2
采纳率:0%
帮助的人:3340
展开全部
你在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方法,然后在这里执行你收到消息后的操作。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式