Android¥¢¥×¥ê¤ò³«È¯¤¹¤ë¤¿¤á¤Î´ðÁäò¤Þ¤È¤á¤Æ¤¢¤ê¤Þ¤¹¡£

Step1

src/jp.co.example.pracetice/TweetTimeLinelTask.java¤ò¿·µ¬ºîÀ®¤·¤Þ¤¹¡£
  1. src/jp.co.example.practice¤ò±¦¥¯¥ê¥Ã¥¯¤·¡¢¿·µ¬¢ª¥¯¥é¥¹¤òÁªÂò
  2. ¼¡¤ÎÍͤËÆþÎϤ·¡¢´°Î»¤ò²¡²¼

Step2

¼¡¤ÎÆâÍƤ˽¤Àµ¤·¤Æ¤¯¤À¤µ¤¤¡£
public class TweetTimeLinelTask extends AsyncTask<String, Void, QueryResult> {
	private static final String TAG = "TweetTimeLinelTask";
	private Timer mUpdateListViewTimer;
	private ProgressBar mProgressBar;
	private static long mSinceId = -1;
	private static MainActivity mActivity;
	private LinkedList<Tweet> mCacheTweets = new LinkedList<Tweet>();
	private ListView mListView;
	private LinkedList<Tweet> mTweets;
	private TweetAdapter mAdapter;
	private Handler mTimeLineHandler = new Handler();
	// tweet¥ê¥¹¥È¥Ó¥å¡¼¤Ø¤Î¹¹¿·½èÍý
	private Runnable mTimeLineRunnable = new Runnable() {
		@Override
		public void run() {
			if (mCacheTweets.size() > 0) {
				// ¥¹¥¯¥í¡¼¥ëÃæ¤Ï¡¢¥ê¥¹¥È¤Î¹¹¿·¤ò¹Ô¤ï¤Ê¤¤
				if (scrollInMiddle()) {
					return;
				}
				Tweet tweet = mCacheTweets.removeLast();
				mTweets.add(0, tweet);
				if (mTweets.size() > Constant.SIZE_PER_PAGE) {
					mTweets.removeLast();
				}
				mAdapter.notifyDataSetChanged();
			} else {
				// tweet¤¬0·ï¤À¤Ã¤¿¾ì¹ç¤Ï¡¢¥ê¥¹¥È¹¹¿·¥¿¥¤¥Þ¡¼¤ò¥­¥ã¥ó¥»¥ë¤¹¤ë
				mUpdateListViewTimer.cancel();
				mActivity.setmHasUpdateListViewTimer(false);
			}
		}

		private boolean scrollInMiddle() {
			int firstVisiblePosition = mListView.getFirstVisiblePosition();
			int lastVisiblePosition = mListView.getLastVisiblePosition();
			int count = mAdapter.getCount();
			return count > 0
					&& firstVisiblePosition != 0
					&& (lastVisiblePosition != count - 1 || count != Constant.SIZE_PER_PAGE);
		}
	};

	public TweetTimeLinelTask() {
	}

	public TweetTimeLinelTask(MainActivity activity) {
		mActivity = activity;
		mProgressBar = activity.getmProgressBar();
		mListView = activity.getmListView();
		mAdapter = activity.getmAdapter();
		mTweets = activity.getmTweets();
		mUpdateListViewTimer = activity.getmUpdateListViewTimer();
	}

	@Override
	protected void onPreExecute() {
		// ¥×¥í¥°¥ì¥¹¥Ð¡¼¤òɽ¼¨¤µ¤»¤ë
		mProgressBar.setVisibility(View.VISIBLE);
	}

	@Override
	protected QueryResult doInBackground(String... params) {
		QueryResult result;
		try {
			// tweeter4j¤òÍøÍѤ·¡¢ÆÃÄê¤Î¥Ï¥Ã¥·¥å¥¿¥°¤¬¤Ä¤¤¤¿tweet¤ò¼èÆÀ¤¹¤ë
			Query query = new Query(params[0]);
			query.setPage(1);
			if (mSinceId != -1 && mSinceId != 0) {
				query.setSinceId(mSinceId);
			}
			query.setRpp(Constant.SIZE_PER_PAGE);
			result = new TwitterManager().search(query);
		} catch (TwitterException e) {
			Log.d(TAG, "error", e);
			result = null;
		}
		return result;
	}

	@Override
	protected void onPostExecute(QueryResult result) {
		// ¥×¥í¥°¥ì¥¹¥Ð¡¼¤òÈóɽ¼¨¤Ë¤¹¤ë
		mProgressBar.setVisibility(View.GONE);
		if (result == null) {
			if (mActivity.isFinishing() && mActivity.isCurrent()) {
				mActivity.showDialog(Constant.ALERT_DIALOG_NET_WARNING);
			}
		} else {
			List<Tweet> newTweets = result.getTweets();
			mSinceId = result.getMaxId();
			mCacheTweets.addAll(0, newTweets);
			if (!mActivity.ismHasUpdateListViewTimer()) {
				// tweet¥ê¥¹¥È¹¹¿·¥¿¥¹¥¯¤ò¥»¥Ã¥È¤¹¤ë
				mUpdateListViewTimer = new Timer();
				TimerTask task = new TimerTask() {
					@Override
					public void run() {
						mTimeLineHandler.post(mTimeLineRunnable);
					}
				};
				mUpdateListViewTimer.schedule(task, 0,
						Constant.SHOW_TIMELINE_IN_LISTVIEW);
				mActivity.setmHasUpdateListViewTimer(true);
			}
		}
		mActivity.setIsFirstLoading(false);
	}
}

¥³¥á¥ó¥È¤ò¤«¤¯


¡Öhttp://¡×¤ò´Þ¤àÅê¹Æ¤Ï¶Ø»ß¤µ¤ì¤Æ¤¤¤Þ¤¹¡£

ÍøÍѵ¬Ìó¤ò¤´³Îǧ¤Î¤¦¤¨¤´µ­Æþ²¼¤µ¤¤

´ÉÍý¿Í/Éû´ÉÍý¿Í¤Î¤ßÊÔ½¸¤Ç¤­¤Þ¤¹