package net.oschina.app.ui; import java.util.ArrayList; import java.util.Date; import java.util.List; import net.oschina.app.AppConfig; import net.oschina.app.AppContext; import net.oschina.app.AppException; import net.oschina.app.R; import net.oschina.app.adapter.GridViewFaceAdapter; import net.oschina.app.adapter.ListViewCommentAdapter; import net.oschina.app.bean.Comment; import net.oschina.app.bean.CommentList; import net.oschina.app.bean.Notice; import net.oschina.app.bean.Result; import net.oschina.app.bean.Tweet; import net.oschina.app.common.StringUtils; import net.oschina.app.common.UIHelper; import net.oschina.app.widget.PullToRefreshListView; import android.app.ProgressDialog; import android.content.Intent; import android.graphics.drawable.AnimationDrawable; import android.graphics.drawable.Drawable; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaPlayer.OnPreparedListener; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.text.Spannable; import android.text.SpannableString; import android.text.style.ImageSpan; import android.util.TypedValue; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.inputmethod.InputMethodManager; import android.webkit.WebView; import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.Button; import android.widget.EditText; import android.widget.GridView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.ViewSwitcher; /** * 动弹详情 * * @author liux (http://my.oschina.net/liux) * @version 1.0 * @created 2012-3-21 */ public class TweetDetail extends BaseActivity { private ImageView mBack; private ImageView mRefresh; private LinearLayout mLinearlayout; private ProgressBar mProgressbar; private PullToRefreshListView mLvComment; private ListViewCommentAdapter lvCommentAdapter; private List<Comment> lvCommentData = new ArrayList<Comment>(); private View lvComment_footer; private TextView lvComment_foot_more; private ProgressBar lvComment_foot_progress; private Handler mCommentHandler; private int lvSumData; private View lvHeader; private ImageView userface; private TextView username; private TextView date; private TextView commentCount; private WebView content; private ImageView image; private ImageView audio; private TextView audioTime; private MediaPlayer player; private LinearLayout audioLayout; private Handler mHandler; private Tweet tweetDetail; private int curId; private int curCatalog; private int curLvDataState; private ViewSwitcher mFootViewSwitcher; private ImageView mFootEditebox; private EditText mFootEditer; private Button mFootPubcomment; private ProgressDialog mProgress; private InputMethodManager imm; private String tempCommentKey = AppConfig.TEMP_COMMENT; private ImageView mFace; private GridView mGridView; private GridViewFaceAdapter mGVFaceAdapter; private int _catalog; private int _id; private int _uid; private String _content; private int _isPostToMyZone; private final static int DATA_LOAD_ING = 0x001; private final static int DATA_LOAD_COMPLETE = 0x002; private final static int DEFAULT_AUDIO_TIME = 60; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.tweet_detail); // 初始化视图控件 this.initView(); // 初始化控件数据 this.initData(); // 初始化表情视图 this.initGridView(); } // 隐藏输入发表回帖状态 private void hideEditor(View v) { imm.hideSoftInputFromWindow(v.getWindowToken(), 0); if(mFootViewSwitcher.getDisplayedChild()==1){ mFootViewSwitcher.setDisplayedChild(0); mFootEditer.clearFocus(); mFootEditer.setVisibility(View.GONE); hideFace();// 隐藏表情 } } /** * 头部加载展示 * * @param type * @param action * 1-init 2-refresh */ private void headButtonSwitch(int type, int action) { switch (type) { case DATA_LOAD_ING: if (action == 1) mLinearlayout.setVisibility(View.GONE); mProgressbar.setVisibility(View.VISIBLE); mRefresh.setVisibility(View.GONE); break; case DATA_LOAD_COMPLETE: mLinearlayout.setVisibility(View.VISIBLE); mProgressbar.setVisibility(View.GONE); mRefresh.setVisibility(View.VISIBLE); break; } } // 初始化视图控件 private void initView() { curId = getIntent().getIntExtra("tweet_id", 0); curCatalog = CommentList.CATALOG_TWEET; if (curId > 0) tempCommentKey = AppConfig.TEMP_COMMENT + "_" + curCatalog + "_" + curId; mBack = (ImageView) findViewById(R.id.tweet_detail_back); mRefresh = (ImageView) findViewById(R.id.tweet_detail_refresh); mLinearlayout = (LinearLayout) findViewById(R.id.tweet_detail_linearlayout); mProgressbar = (ProgressBar) findViewById(R.id.tweet_detail_head_progress); mFace = (ImageView) findViewById(R.id.tweet_detail_foot_face); mBack.setOnClickListener(UIHelper.finish(this)); mRefresh.setOnClickListener(refreshClickListener); mFace.setOnClickListener(facesClickListener); imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); mFootViewSwitcher = (ViewSwitcher) findViewById(R.id.tweet_detail_foot_viewswitcher); mFootPubcomment = (Button) findViewById(R.id.tweet_detail_foot_pubcomment); mFootPubcomment.setOnClickListener(commentpubClickListener); mFootEditebox = (ImageView) findViewById(R.id.tweet_detail_footbar_editebox); mFootEditebox.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { mFootViewSwitcher.showNext(); mFootEditer.setVisibility(View.VISIBLE); mFootEditer.requestFocus(); mFootEditer.requestFocusFromTouch(); imm.showSoftInput(mFootEditer, 0);// 显示软键盘 } }); mFootEditer = (EditText) findViewById(R.id.tweet_detail_foot_editer); mFootEditer.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // 显示软键盘&隐藏表情 showIMM(); } }); mFootEditer.setOnKeyListener(new View.OnKeyListener() { public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { hideEditor(v); return true; } return false; } }); // 编辑器添加文本监听 mFootEditer.addTextChangedListener(UIHelper.getTextWatcher(this, tempCommentKey)); // 显示临时编辑内容 UIHelper.showTempEditContent(this, mFootEditer, tempCommentKey); lvHeader = View.inflate(this, R.layout.tweet_detail_content, null); userface = (ImageView) lvHeader .findViewById(R.id.tweet_listitem_userface); username = (TextView) lvHeader .findViewById(R.id.tweet_listitem_username); date = (TextView) lvHeader.findViewById(R.id.tweet_listitem_date); commentCount = (TextView) lvHeader .findViewById(R.id.tweet_listitem_commentCount); image = (ImageView) lvHeader.findViewById(R.id.tweet_listitem_image); audio = (ImageView) lvHeader.findViewById(R.id.tweet_audio_controller); audioTime = (TextView) lvHeader.findViewById(R.id.tweet_audio_time); audioLayout = (LinearLayout) lvHeader .findViewById(R.id.tweet_audio_layout); content = (WebView) lvHeader.findViewById(R.id.tweet_listitem_content); content.getSettings().setJavaScriptEnabled(false); content.getSettings().setSupportZoom(true); content.getSettings().setBuiltInZoomControls(true); content.getSettings().setDefaultFontSize(12); lvComment_footer = getLayoutInflater().inflate( R.layout.listview_footer, null); lvComment_foot_more = (TextView) lvComment_footer .findViewById(R.id.listview_foot_more); lvComment_foot_progress = (ProgressBar) lvComment_footer .findViewById(R.id.listview_foot_progress); lvCommentAdapter = new ListViewCommentAdapter(this, lvCommentData, R.layout.comment_listitem); mLvComment = (PullToRefreshListView) findViewById(R.id.tweet_detail_commentlist); mLvComment.addHeaderView(lvHeader);// 把动弹详情放进listview头部 mLvComment.addFooterView(lvComment_footer);// 添加底部视图 必须在setAdapter前 mLvComment.setAdapter(lvCommentAdapter); mLvComment .setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 点击头部、底部栏无效 if (position == 0 || view == lvComment_footer || position == 1 || view == lvHeader) return; Comment com = null; // 判断是否是TextView if (view instanceof TextView) { com = (Comment) view.getTag(); } else { ImageView img = (ImageView) view .findViewById(R.id.comment_listitem_userface); com = (Comment) img.getTag(); } if (com == null) return; // 跳转--回复评论界面 UIHelper.showCommentReply(TweetDetail.this, curId, curCatalog, com.getId(), com.getAuthorId(), com.getAuthor(), com.getContent()); } }); mLvComment.setOnScrollListener(new AbsListView.OnScrollListener() { public void onScrollStateChanged(AbsListView view, int scrollState) { mLvComment.onScrollStateChanged(view, scrollState); // 数据为空--不用继续下面代码了 if (lvCommentData.size() == 0) return; // 判断是否滚动到底部 boolean scrollEnd = false; try { if (view.getPositionForView(lvComment_footer) == view .getLastVisiblePosition()) scrollEnd = true; } catch (Exception e) { scrollEnd = false; } // 滑动到底部加载更多的数据 if (scrollEnd && curLvDataState == UIHelper.LISTVIEW_DATA_MORE) { mLvComment.setTag(UIHelper.LISTVIEW_DATA_LOADING); lvComment_foot_more.setText(R.string.load_ing); lvComment_foot_progress.setVisibility(View.VISIBLE); // 当前pageIndex int pageIndex = lvSumData / 20; loadLvCommentData(curId, curCatalog, pageIndex, mCommentHandler, UIHelper.LISTVIEW_ACTION_SCROLL); } } public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { mLvComment.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount); } }); mLvComment .setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { // 点击头部、底部栏无效 if (position == 0 || view == lvComment_footer || position == 1 || view == lvHeader) return false; Comment _com = null; // 判断是否是TextView if (view instanceof TextView) { _com = (Comment) view.getTag(); } else { ImageView img = (ImageView) view .findViewById(R.id.comment_listitem_userface); _com = (Comment) img.getTag(); } if (_com == null) return false; final Comment com = _com; final AppContext ac = (AppContext) getApplication(); // 操作--回复 & 删除 int uid = ac.getLoginUid(); // 判断该评论是否是当前登录用户发表的:true--有删除操作 false--没有删除操作 if (uid == com.getAuthorId()) { final Handler handler = new Handler() { public void handleMessage(Message msg) { if (msg.what == 1) { Result res = (Result) msg.obj; if (res.OK()) { lvSumData--; lvCommentData.remove(com); lvCommentAdapter .notifyDataSetChanged(); } UIHelper.ToastMessage(TweetDetail.this, res.getErrorMessage()); } else { ((AppException) msg.obj) .makeToast(TweetDetail.this); } } }; final Thread thread = new Thread() { public void run() { Message msg = new Message(); try { Result res = ac.delComment(curId, curCatalog, com.getId(), com.getAuthorId()); msg.what = 1; msg.obj = res; } catch (AppException e) { e.printStackTrace(); msg.what = -1; msg.obj = e; } handler.sendMessage(msg); } }; UIHelper.showCommentOptionDialog(TweetDetail.this, curId, curCatalog, com, thread); } else { UIHelper.showCommentOptionDialog(TweetDetail.this, curId, curCatalog, com, null); } return true; } }); mLvComment .setOnRefreshListener(new PullToRefreshListView.OnRefreshListener() { public void onRefresh() { loadLvCommentData(curId, curCatalog, 0, mCommentHandler, UIHelper.LISTVIEW_ACTION_REFRESH); } }); } // 初始化控件数据 private void initData() { // 加载动弹 mHandler = new Handler() { public void handleMessage(Message msg) { headButtonSwitch(DATA_LOAD_COMPLETE, 1); if (msg.what == 1) { username.setText(tweetDetail.getAuthor()); username.setOnClickListener(faceClickListener); date.setText(StringUtils.friendly_time(tweetDetail .getPubDate())); commentCount.setText(tweetDetail.getCommentCount() + ""); String body = UIHelper.WEB_STYLE + tweetDetail.getBody(); body = body.replaceAll( "(<img[^>]*?)\\s+width\\s*=\\s*\\S+", "$1"); body = body.replaceAll( "(<img[^>]*?)\\s+height\\s*=\\s*\\S+", "$1"); content.loadDataWithBaseURL(null, body, "text/html", "utf-8", null); content.setWebViewClient(UIHelper.getWebViewClient()); // 加载用户头像 String faceURL = tweetDetail.getFace(); if (faceURL.endsWith("portrait.gif") || StringUtils.isEmpty(faceURL)) { userface.setImageResource(R.drawable.widget_dface); } else { UIHelper.showUserFace(userface, faceURL); } userface.setOnClickListener(faceClickListener); // 加载图片 String imgSmall = tweetDetail.getImgSmall(); if (!StringUtils.isEmpty(imgSmall)) { UIHelper.showLoadImage(image, imgSmall, null); image.setVisibility(View.VISIBLE); image.setOnClickListener(imageClickListener); } // 添加语音播放 final String attach = tweetDetail.getAttach(); if (!StringUtils.isEmpty(attach)) { player = new MediaPlayer(); try { player.setDataSource(attach); try { player.prepare(); } catch (Exception e) { UIHelper.ToastMessage(TweetDetail.this, R.string.msg_load_audio_fail); } audio.setVisibility(View.VISIBLE); final AnimationDrawable anima = (AnimationDrawable) audio .getDrawable(); anima.setOneShot(false); anima.stop(); anima.selectDrawable(0); audioLayout.setVisibility(View.VISIBLE); audioLayout .setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (player.isPlaying()) { player.pause(); anima.stop(); } else { player.start(); anima.start(); } } }); player.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { // TODO Auto-generated method stub int time = mp.getDuration() / 1000; audioTime.setText(time + "s"); int width = 100 + time; width = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, width, getResources().getDisplayMetrics()); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( width, LinearLayout.LayoutParams.MATCH_PARENT); audioLayout.setLayoutParams(params); } }); player.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { try { mp.stop(); mp.reset(); mp.setDataSource(attach); mp.prepare(); anima.stop(); anima.selectDrawable(0); } catch (Exception e) { UIHelper.ToastMessage(TweetDetail.this, R.string.msg_load_audio_fail); } } }); } catch (Exception e) { UIHelper.ToastMessage(TweetDetail.this, R.string.msg_load_audio_fail); } } // 发送通知广播 if (msg.obj != null) { UIHelper.sendBroadCast(TweetDetail.this, (Notice) msg.obj); } } else if (msg.what == 0) { UIHelper.ToastMessage(TweetDetail.this, R.string.msg_load_is_null); } else { ((AppException) msg.obj).makeToast(TweetDetail.this); } } }; this.loadTweetDetail(curId, mHandler, false); // 加载评论 mCommentHandler = new Handler() { public void handleMessage(Message msg) { headButtonSwitch(DATA_LOAD_COMPLETE, 2); if (msg.what >= 0) { CommentList list = (CommentList) msg.obj; Notice notice = list.getNotice(); // 处理listview数据 switch (msg.arg1) { case UIHelper.LISTVIEW_ACTION_INIT: case UIHelper.LISTVIEW_ACTION_REFRESH: lvSumData = msg.what; lvCommentData.clear();// 先清除原有数据 lvCommentData.addAll(list.getCommentlist()); break; case UIHelper.LISTVIEW_ACTION_SCROLL: lvSumData += msg.what; if (lvCommentData.size() > 0) { for (Comment com1 : list.getCommentlist()) { boolean b = false; for (Comment com2 : lvCommentData) { if (com1.getId() == com2.getId() && com1.getAuthorId() == com2 .getAuthorId()) { b = true; break; } } if (!b) lvCommentData.add(com1); } } else { lvCommentData.addAll(list.getCommentlist()); } break; } if (msg.what < 20) { curLvDataState = UIHelper.LISTVIEW_DATA_FULL; lvCommentAdapter.notifyDataSetChanged(); lvComment_foot_more.setText(R.string.load_full); } else if (msg.what == 20) { curLvDataState = UIHelper.LISTVIEW_DATA_MORE; lvCommentAdapter.notifyDataSetChanged(); lvComment_foot_more.setText(R.string.load_more); } // 发送通知广播 if (notice != null) { UIHelper.sendBroadCast(TweetDetail.this, notice); } } else if (msg.what == -1) { // 有异常--也显示更多 & 弹出错误消息 curLvDataState = UIHelper.LISTVIEW_DATA_MORE; lvComment_foot_more.setText(R.string.load_more); ((AppException) msg.obj).makeToast(TweetDetail.this); } if (lvCommentData.size() == 0) { curLvDataState = UIHelper.LISTVIEW_DATA_EMPTY; lvComment_foot_more.setText(R.string.load_empty); } lvComment_foot_progress.setVisibility(View.GONE); if (msg.arg1 == UIHelper.LISTVIEW_ACTION_REFRESH) mLvComment .onRefreshComplete(getString(R.string.pull_to_refresh_update) + new Date().toLocaleString()); } }; this.loadLvCommentData(curId, curCatalog, 0, mCommentHandler, UIHelper.LISTVIEW_ACTION_INIT); } @Override public void onBackPressed() { if (null != this.player && this.player.isPlaying()) { this.player.stop(); this.player.release(); } super.onBackPressed(); } /** * 线程加载评论数据 * * @param id * 当前文章id * @param catalog * 分类 * @param pageIndex * 当前页数 * @param handler * 处理器 * @param action * 动作标识 */ private void loadLvCommentData(final int id, final int catalog, final int pageIndex, final Handler handler, final int action) { this.headButtonSwitch(DATA_LOAD_ING, 2); new Thread() { public void run() { Message msg = new Message(); boolean isRefresh = false; if (action == UIHelper.LISTVIEW_ACTION_REFRESH || action == UIHelper.LISTVIEW_ACTION_SCROLL) isRefresh = true; try { CommentList commentlist = ((AppContext) getApplication()) .getCommentList(catalog, id, pageIndex, isRefresh); msg.what = commentlist.getPageSize(); msg.obj = commentlist; } catch (AppException e) { e.printStackTrace(); msg.what = -1; msg.obj = e; } msg.arg1 = action;// 告知handler当前action handler.sendMessage(msg); } }.start(); } /** * 线程加载动弹详情 * * @param tweetId * @param handler */ private void loadTweetDetail(final int tweetId, final Handler handler, final boolean isRefresh) { this.headButtonSwitch(DATA_LOAD_ING, 1); new Thread() { public void run() { Message msg = new Message(); try { tweetDetail = ((AppContext) getApplication()).getTweet( tweetId, isRefresh); msg.what = (tweetDetail != null && tweetDetail.getId() > 0) ? 1 : 0; msg.obj = (tweetDetail != null) ? tweetDetail.getNotice() : null; } catch (AppException e) { e.printStackTrace(); msg.what = -1; msg.obj = e; } handler.sendMessage(msg); } }.start(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != RESULT_OK) return; if (data == null) return; if (requestCode == UIHelper.REQUEST_CODE_FOR_RESULT) { Comment comm = (Comment) data .getSerializableExtra("COMMENT_SERIALIZABLE"); lvCommentData.add(0, comm); lvCommentAdapter.notifyDataSetChanged(); mLvComment.setSelection(0); } } // 初始化表情控件 private void initGridView() { mGVFaceAdapter = new GridViewFaceAdapter(this); mGridView = (GridView) findViewById(R.id.tweet_detail_foot_faces); mGridView.setAdapter(mGVFaceAdapter); mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 插入的表情 SpannableString ss = new SpannableString(view.getTag() .toString()); Drawable d = getResources().getDrawable( (int) mGVFaceAdapter.getItemId(position)); d.setBounds(0, 0, 35, 35);// 设置表情图片的显示大小 ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BOTTOM); ss.setSpan(span, 0, view.getTag().toString().length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // 在光标所在处插入表情 mFootEditer.getText().insert(mFootEditer.getSelectionStart(), ss); } }); } private void showIMM() { mFace.setTag(1); showOrHideIMM(); } private void showFace() { mFace.setImageResource(R.drawable.widget_bar_keyboard); mFace.setTag(1); mGridView.setVisibility(View.VISIBLE); } private void hideFace() { mFace.setImageResource(R.drawable.widget_bar_face); mFace.setTag(null); mGridView.setVisibility(View.GONE); } private void showOrHideIMM() { if (mFace.getTag() == null) { // 隐藏软键盘 imm.hideSoftInputFromWindow(mFootEditer.getWindowToken(), 0); // 显示表情 showFace(); } else { // 显示软键盘 imm.showSoftInput(mFootEditer, 0); // 隐藏表情 hideFace(); } } // 表情控件点击事件 private View.OnClickListener facesClickListener = new View.OnClickListener() { public void onClick(View v) { showOrHideIMM(); } }; private View.OnClickListener refreshClickListener = new View.OnClickListener() { public void onClick(View v) { hideEditor(v); loadTweetDetail(curId, mHandler, true); loadLvCommentData(curId, curCatalog, 0, mCommentHandler, UIHelper.LISTVIEW_ACTION_REFRESH); } }; private View.OnClickListener faceClickListener = new View.OnClickListener() { public void onClick(View v) { if (tweetDetail != null) UIHelper.showUserCenter(v.getContext(), tweetDetail.getAuthorId(), tweetDetail.getAuthor()); } }; private View.OnClickListener imageClickListener = new View.OnClickListener() { public void onClick(View v) { if (tweetDetail != null) UIHelper.showImageZoomDialog(v.getContext(), tweetDetail.getImgBig()); } }; private View.OnClickListener commentpubClickListener = new View.OnClickListener() { public void onClick(View v) { _id = curId; if (curId == 0) { return; } _catalog = curCatalog; _content = mFootEditer.getText().toString(); if (StringUtils.isEmpty(_content)) { UIHelper.ToastMessage(v.getContext(), "请输入评论内容"); return; } final AppContext ac = (AppContext) getApplication(); if (!ac.isLogin()) { UIHelper.showLoginDialog(TweetDetail.this); return; } // if(mZone.isChecked()) // _isPostToMyZone = 1; _uid = ac.getLoginUid(); mProgress = ProgressDialog.show(v.getContext(), null, "发布中···", true, true); final Handler handler = new Handler() { public void handleMessage(Message msg) { if (mProgress != null) mProgress.dismiss(); if (msg.what == 1 && msg.obj != null) { Result res = (Result) msg.obj; UIHelper.ToastMessage(TweetDetail.this, res.getErrorMessage()); if (res.OK()) { // 发送通知广播 if (res.getNotice() != null) { UIHelper.sendBroadCast(TweetDetail.this, res.getNotice()); } // 恢复初始底部栏 mFootViewSwitcher.setDisplayedChild(0); mFootEditer.clearFocus(); mFootEditer.setText(""); mFootEditer.setVisibility(View.GONE); // 隐藏软键盘 imm.hideSoftInputFromWindow( mFootEditer.getWindowToken(), 0); // 隐藏表情 hideFace(); // 更新评论列表 lvCommentData.add(0, res.getComment()); lvCommentAdapter.notifyDataSetChanged(); mLvComment.setSelection(0); // 清除之前保存的编辑内容 ac.removeProperty(tempCommentKey); } } else { ((AppException) msg.obj).makeToast(TweetDetail.this); } } }; new Thread() { public void run() { Message msg = new Message(); Result res = new Result(); try { // 发表评论 res = ac.pubComment(_catalog, _id, _uid, _content, _isPostToMyZone); msg.what = 1; msg.obj = res; } catch (AppException e) { e.printStackTrace(); msg.what = -1; msg.obj = e; } handler.sendMessage(msg); } }.start(); } }; }