自定义adapter问题

-_-_-_- 2013-01-23 10:09:06
碰到一个问题:当我按back键结束当前Activity后,用startActivity再启动该Activity时,onCreate方法里面自定义的adapter不为null,但是在Handler的handleMessage方法里却是null,这是为什么呢?
public class ChatActivity extends Activity implements OnClickListener,OnItemClickListener{
private static final int UTFMSG = 0; //文字信息
private static final int PNGMSG = 1; //图片信息
EditText edt_myContent;
ListView listView;
Button btn_send, btn_quit;
ImageButton imgbtn_expression;
MyHandler myHandler;
private SimpleChatAdapter adapter; //聊天记录listview适配器
private boolean flag = true;
private DataOutputStream dos;
private DataInputStream dis;
private Dialog dialog; //表情对话框
private static Integer[] imageIds = FaceDate.getFaceIds();//表情数据id
private int clickId = -1; //聊天list中的item位置

private int from_ip,to_ip; //发送者和接受者的ip

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat);
init();
if(adapter==null) {
adapter = new SimpleChatAdapter(this);
Log.i("info", "onCreate中adapter为:"+adapter.toString());
}
listView.addHeaderView(LayoutInflater.from(this).inflate(R.layout.listview_title, null));
listView.setAdapter(adapter);
myHandler = new MyHandler();
new Thread(new ReceiveThread()).start();
//为按钮添加点击事件
btn_send.setOnClickListener(this);
btn_quit.setOnClickListener(this);
imgbtn_expression.setOnClickListener(this);
//为listView添加点击事件
listView.setOnItemClickListener(this);
}

上面的代码为我的Activity,还有onCreate方法,其中SimpleChatAdapter为自定义适配器
	/**
* 接受服务器端数据的方法
*/
private void receiveMessage() {
try {
String receiveStr;
receiveStr = dis.readUTF();
Log.i("info", "receiveStr的值为:"+receiveStr);
if(receiveStr == null)
return;
if(receiveStr.equals(Constants.SEND_PICTURE)) { //指令为图片
String date = dis.readUTF();
int datalen = dis.readInt();
byte[] inputBytes = new byte[datalen];
int read = 0;
while (read < datalen) {
int result = dis.read(inputBytes, read, datalen - read);
if (result == -1)
break;
read += result;
}
Message msg = new Message();
msg.what = PNGMSG;
Bundle b = new Bundle();// 存放数据
b.putString("date", date);
b.putByteArray("pic", inputBytes);
msg.setData(b);
myHandler.sendMessage(msg); // 向Handler发送消息,更新UI
} else { //指令不是图片则为文字信息
Log.i("info", "有信息接受到");
Message msg = new Message();
msg.what = UTFMSG;
Bundle b = new Bundle();// 存放数据
b.putString("message", receiveStr);
msg.setData(b);
myHandler.sendMessage(msg); // 向Handler发送消息,更新UI
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 配合主线程更新UI
* @author Administrator
*
*/
class MyHandler extends Handler {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
Bundle b = msg.getData();
switch (msg.what) {
case PNGMSG: //图片信息
adapter.addMessage(b);
break;
case UTFMSG: //表情和文字信息
Log.i("info", "添加内容");
Log.i("info", "myHandler为:"+myHandler.toString());
Log.i("info", "adapter为:"+adapter);
adapter.addMessage(b.getString("message"));
break;
default:
break;
}
}
}

上面为接收数据并用handler转发数据处理的代码。
	@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if(keyCode == KeyEvent.KEYCODE_BACK) {
flag = false;
Log.i("info", "ChatActivity退出");
adapter = null;
//adapter.clear();
listView = null;
finish();
}
return super.onKeyDown(keyCode, event);
}

上面是back键代码。
以下是ChatActivity启动退出,再启动接收数据后的LOG和错误
01-23 10:05:43.459: I/info(29247): onCreate中adapter为:com.zhutj.adapter.SimpleChatAdapter@40757810
01-23 10:05:55.689: W/KeyCharacterMap(29247): Can't open keycharmap file
01-23 10:05:55.689: W/KeyCharacterMap(29247): Error loading keycharmap file '/system/usr/keychars/ft5206_input.kcm.bin'. hw.keyboards.131073.devname='ft5206_input'
01-23 10:05:55.689: W/KeyCharacterMap(29247): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
01-23 10:05:55.689: I/info(29247): ChatActivity退出
01-23 10:05:57.069: I/info(29247): onCreate中adapter为:com.zhutj.adapter.SimpleChatAdapter@40769780
01-23 10:06:15.909: I/info(29247): receiveStr的值为:71 [2013-01-23 10:05:33]splitf050
01-23 10:06:15.909: I/info(29247): 有信息接受到
01-23 10:06:15.909: I/info(29247): 添加内容
01-23 10:06:15.909: I/info(29247): myHandler为:Handler{4077f260}
01-23 10:06:15.909: I/info(29247): adapter为:null
01-23 10:06:15.909: W/dalvikvm(29247): threadid=1: thread exiting with uncaught exception (group=0x40248560)
01-23 10:06:15.919: E/AndroidRuntime(29247): FATAL EXCEPTION: main
01-23 10:06:15.919: E/AndroidRuntime(29247): java.lang.NullPointerException
01-23 10:06:15.919: E/AndroidRuntime(29247): at com.zhutj.chatclient.ChatActivity$MyHandler.handleMessage(ChatActivity.java:187)
01-23 10:06:15.919: E/AndroidRuntime(29247): at android.os.Handler.dispatchMessage(Handler.java:99)
01-23 10:06:15.919: E/AndroidRuntime(29247): at android.os.Looper.loop(Looper.java:130)
01-23 10:06:15.919: E/AndroidRuntime(29247): at android.app.ActivityThread.main(ActivityThread.java:3683)
...全文
219 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
-_-_-_- 2013-01-24
  • 打赏
  • 举报
回复
问题已经解决了,不是楼上几位说的那样,主要是DataOutputStream的readUTF方法是个阻塞方法,导致线程并没有停止,所以adapter的引用还是上一个,只有第二次过来才会结束前面的线程。还是谢谢各位的回复,结贴。。。
veardn 2013-01-24
  • 打赏
  • 举报
回复
引用 5 楼 zhutieju 的回复:
引用 4 楼 veardn 的回复:handler应该写在activity里,因为你是讯通线程向主线程发消息。 你好,能具体说说吗,我没看懂,我的handler已经在主线程的onCreate方法里面new了
那你把handler设成static的,应该就好了
veardn 2013-01-23
  • 打赏
  • 举报
回复
handler应该写在activity里,因为你是讯通线程向主线程发消息。
-_-_-_- 2013-01-23
  • 打赏
  • 举报
回复
引用 2 楼 lvl408626166 的回复:
线程没关吧,关了试试
不好意思,你指的是哪个线程,我只有receiveMessage方法是在线程中循环调用的,onKeyDown里面的flag设置为false就是停止这个线程
lvl408626166 2013-01-23
  • 打赏
  • 举报
回复
线程没关吧,关了试试
-_-_-_- 2013-01-23
  • 打赏
  • 举报
回复
雨焰 2013-01-23
  • 打赏
  • 举报
回复
引用 5 楼 zhutieju 的回复:
引用 4 楼 veardn 的回复:handler应该写在activity里,因为你是讯通线程向主线程发消息。 你好,能具体说说吗,我没看懂,我的handler已经在主线程的onCreate方法里面new了
你的handle不要在onCreate方法里用,你放在方法外面!
-_-_-_- 2013-01-23
  • 打赏
  • 举报
回复
引用 4 楼 veardn 的回复:
handler应该写在activity里,因为你是讯通线程向主线程发消息。
你好,能具体说说吗,我没看懂,我的handler已经在主线程的onCreate方法里面new了

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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