IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 新浪微博客户端开发之发布微博,Android面试题 -> 正文阅读

[移动开发]新浪微博客户端开发之发布微博,Android面试题

“@” + atText + " ");

weiboContent.setSelection(weiboContent.getSelectionStart() - 1

  • atText.length(), weiboContent.getSelectionStart() - 1);

imm.showSoftInput(weiboContent, InputMethodManager.SHOW_FORCED);

break;

case R.id.btn_insert_face: // 插入表情

if (inputBoard.getVisibility() == View.GONE) {

insertFaceButton

.setImageResource(R.drawable.btn_insert_keyboard);

inputBoard.setVisibility(View.VISIBLE);

faceList.setVisibility(View.VISIBLE);

} else {

insertFaceButton.setImageResource(R.drawable.btn_insert_face);

inputBoard.setVisibility(View.GONE);

faceList.setVisibility(View.GONE);

}

break;

case R.id.iv_insert_pic_min_viewer: // 图片浏览

intent = new Intent(PostWeibo.this, PictureViewer.class);

intent.putExtra(“filename”, filename);

startActivityForResult(intent, CODE_REQUEST_PICTURE_VIEWER);

break;

default:

break;

}

}

// 发送

private void send() {

String text = weiboContent.getText().toString();

switch (type) {

case TYPE_POST_WEIBO: // 发送微博

if (filename != null && “”.equals("")) {

text = “分享图片”;

} else if ("".equals(text)) {

Toast.makeText(this, “请输入微博内容”, Toast.LENGTH_LONG).show();

return;

}

// 创建一个发布微博的任务

PostWeiboTask postWeiboTask = new PostWeiboTask();

postWeiboTask.text = text;

postWeiboTask.file = filename;

Tools.getGlobalObject(this).getWorkQueueStorage()

.addTask(postWeiboTask);

Toast.makeText(this, “已经提交发布微博任务到工作队列”, Toast.LENGTH_LONG).show();

break;

case TYPE_FORWARD: // 转发微博

if ("".equals(text)) {

Toast.makeText(this, “请输入微博内容”, Toast.LENGTH_LONG).show();

return;

}

RepostWeiboTask repostWeiboTask = new RepostWeiboTask();

repostWeiboTask.id = statusId;

repostWeiboTask.text = text;

if (isCommentCheckBox.isChecked()) { // 是否评论

repostWeiboTask.isComment = 1;

} else {

repostWeiboTask.isComment = 0;

}

Tools.getGlobalObject(this).getWorkQueueStorage()

.addTask(repostWeiboTask);

Toast.makeText(this, “已经提交转发微博任务到工作队列”, Toast.LENGTH_LONG).show();

break;

case TYPE_COMMENT:

if ("".equals(text)) {

Toast.makeText(this, “请输入微博内容”, Toast.LENGTH_LONG).show();

return;

}

CommentWeiboTask commentWeiboTask = new CommentWeiboTask();

commentWeiboTask.text = text;

commentWeiboTask.weiboText = text + this.text;

commentWeiboTask.id = statusId;

if (postWeiboCheckBox.isChecked()) {

commentWeiboTask.postWeibo = true;

} else {

commentWeiboTask.postWeibo = false;

}

Tools.getGlobalObject(this).getWorkQueueStorage()

.addTask(commentWeiboTask);

// 返回结果

setResult(TYPE_COMMENT);

Toast.makeText(this, “已经提交评论微博任务到工作队列”, Toast.LENGTH_LONG);

break;

}

finish();

}

@Override

protected void onDestroy() {

filename = null;

super.onDestroy();

}

}

来说说实现发布微博功能的关键点:

1. 任务队列(多线程的实现)

2. 任务存储

3. 任务监视

4. 任务处理

发布微博我们点击发送按钮就会调用send()方法,来看看send方法里面做了什么操作

// 发送

private void send() {

String text = weiboContent.getText().toString();

switch (type) {

case TYPE_POST_WEIBO: //
发送微博

if (filename != null && “”.equals("")) {

text = “分享图片”;

} else if ("".equals(text)) {

Toast.makeText(this, “请输入微博内容”, Toast.LENGTH_LONG).show();

return;

}

// 创建一个发布微博的任务

PostWeiboTask postWeiboTask = new PostWeiboTask();

postWeiboTask.text = text;

postWeiboTask.file = filename;

Tools.getGlobalObject(this).getWorkQueueStorage()

.addTask(postWeiboTask);

Toast.makeText(this, “已经提交发布微博任务到工作队列”, Toast.LENGTH_LONG).show();

break;

case TYPE_FORWARD: // 转发微博

if ("".equals(text)) {

Toast.makeText(this, “请输入微博内容”, Toast.LENGTH_LONG).show();

return;

}

RepostWeiboTask repostWeiboTask = new RepostWeiboTask();

repostWeiboTask.id = statusId;

repostWeiboTask.text = text;

if (isCommentCheckBox.isChecked()) { // 是否评论

repostWeiboTask.isComment = 1;

} else {

repostWeiboTask.isComment = 0;

}

Tools.getGlobalObject(this).getWorkQueueStorage()

.addTask(repostWeiboTask);

Toast.makeText(this, “已经提交转发微博任务到工作队列”, Toast.LENGTH_LONG).show();

break;

case TYPE_COMMENT:

if ("".equals(text)) {

Toast.makeText(this, “请输入微博内容”, Toast.LENGTH_LONG).show();

return;

}

CommentWeiboTask commentWeiboTask = new CommentWeiboTask();

commentWeiboTask.text = text;

commentWeiboTask.weiboText = text + this.text;

commentWeiboTask.id = statusId;

if (postWeiboCheckBox.isChecked()) {

commentWeiboTask.postWeibo = true;

} else {

commentWeiboTask.postWeibo = false;

}

Tools.getGlobalObject(this).getWorkQueueStorage()

.addTask(commentWeiboTask);

// 返回结果

setResult(TYPE_COMMENT);

Toast.makeText(this, “已经提交评论微博任务到工作队列”, Toast.LENGTH_LONG);

break;

}

finish();

}

这里只看发送微博就行了,至于转发微博还有评论都是提交到任务队列里去的,都是类似的实现过程,所以我介绍完发布微博这个流程,关于转发和评论的实现我就不多介绍,只会在需要注意的地方介绍一下。

我们可以看到,会先创建一个任务,然后把任务添加到任务队列里面

PostWeiboTask这个类,里面的内容如下:

package com.wwj.sina.weibo.workqueue.task;

/**

  • 发布微博任务

  • @author wwj

*/

public class PostWeiboTask extends ParentTask {

public String text;

public String file;

}

它继承ParentTask这个类

package com.wwj.sina.weibo.workqueue.task;

import com.wwj.sina.weibo.workqueue.DoneAndProcess;

public class ParentTask {

public DoneAndProcess doneAndProcess;

}

而ParentTask有DoneAndProcess这个接口属性

package com.wwj.sina.weibo.workqueue;

import com.wwj.sina.weibo.workqueue.task.ParentTask;

/**

  • 完成任务后的接口

  • @author wwj

*/

public interface DoneAndProcess {

void doneProcess(ParentTask task);

}

这个接口定义了一个doneProcess这个方法,里面传入一个ParentTask对象,用于完成任务后的收尾工作,这里是用来刷新数据。

与之对应的执行任务的接口DoingAndProcess

package com.wwj.sina.weibo.workqueue;

import java.util.List;

/**

  • 处理任务的接口

  • @author wwj

*/

public interface DoingAndProcess {

void doingProcess(List list) throws Exception;

}

这个接口有一个方法是doingProcess,传入List为参数,意味着它要执行List里面的任务,实现这个接口的类就是用要实现各种任务的,实现这个接口的类叫TaskMan。

package com.wwj.sina.weibo.workqueue.task;

import java.util.List;

import android.app.Activity;

import android.os.Handler;

import android.os.Message;

import android.widget.Toast;

import com.wwj.sina.weibo.net.PullFile;

import com.wwj.sina.weibo.workqueue.DoingAndProcess;

import com.wwj.sina.weibo.workqueue.task.process.CommentWeiboProcess;

import com.wwj.sina.weibo.workqueue.task.process.FavoriteWeiboProcess;

import com.wwj.sina.weibo.workqueue.task.process.PostWeiboProcess;

import com.wwj.sina.weibo.workqueue.task.process.RepostWeiboProcess;

/**

  • 处理任务的中枢

  • @author wwj

*/

public class TaskMan implements DoingAndProcess {

private Activity activity;

private PostWeiboProcess postWeiboProcess;

private RepostWeiboProcess repostWeiboProcess;

private CommentWeiboProcess commentWeiboProcess;

private FavoriteWeiboProcess favoriteWeiboProcess;

private Handler msgHandler = new Handler() {

public void handleMessage(android.os.Message msg) {

String str = String.valueOf(msg.obj);

Toast.makeText(activity, str, Toast.LENGTH_LONG).show();

super.handleMessage(msg);

};

};

public TaskMan(Activity activity) {

super();

this.activity = activity;

// 创建各种任务处理类对象

postWeiboProcess = new PostWeiboProcess(activity);

repostWeiboProcess = new RepostWeiboProcess(activity);

commentWeiboProcess = new CommentWeiboProcess(activity);

favoriteWeiboProcess = new FavoriteWeiboProcess(activity);

}

@Override

public void doingProcess(List list) throws Exception {

// 开始处理各种任务

for (Object task : list) {

// 处理发布微博任务

if (task instanceof PostWeiboTask) {

try {

postWeiboProcess.process((PostWeiboTask) task);

Message msg = new Message();

msg.obj = “成功发布微博”;

msgHandler.sendMessage(msg);

} catch (Exception e) {

exceptionProcess(task);

throw e;

}

// 处理下载文件任务

} else if (task instanceof PullFileTask) {

PullFileTask pullFileTask = (PullFileTask) task;

PullFile pullFile = new PullFile();

pullFile.doingProcess(pullFileTask.fileUrl);

// 处理转发微博任务

} else if (task instanceof RepostWeiboTask) {

try {

repostWeiboProcess.process((RepostWeiboTask) task);

Message msg = new Message();

msg.obj = “成功转发微博”;

msgHandler.sendMessage(msg);

} catch (Exception e) {

exceptionProcess(task);

throw e;

}

// 处理评论微博任务

} else if (task instanceof CommentWeiboTask) {

try {

commentWeiboProcess.process((CommentWeiboTask) task);

Message msg = new Message();

msg.obj = “成功评论微博”;

msgHandler.sendMessage(msg);

} catch (Exception e) {

exceptionProcess(task);

throw e;

}

// 处理收藏微博任务

} else if (task instanceof FavoriteWeiboTask) {

try {

favoriteWeiboProcess.process((FavoriteWeiboTask) task);

} catch (Exception e) {

exceptionProcess(task);

throw e;

}

}

}

}

// 执行任务类失败时调用该方法

private void exceptionProcess(Object task) {

Message msg = new Message();

// 任务处理

if (task instanceof PostWeiboTask) {

msg.obj = “微博发布失败”;

} else if (task instanceof RepostWeiboTask) {

msg.obj = “转发微博失败”;

} else if (task instanceof CommentWeiboTask) {

msg.obj = “评论微博失败”;

} else if (task instanceof FavoriteWeiboTask) {

msg.obj = “收藏微博失败”;

}

msgHandler.sendMessage(msg);

}

}

这个类很重要哈,我们可以看到任务队列里面的任务都在这里完成了,具体实现任务处理的类,这里只介绍PostWeiboProcess。

package com.wwj.sina.weibo.workqueue.task.process;

import com.wwj.sina.weibo.library.WeiboManager;

import com.wwj.sina.weibo.util.Tools;

import com.wwj.sina.weibo.workqueue.task.PostWeiboTask;

import android.app.Activity;

/**

  • 发博微博任务处理类

  • @author wwj

*/

public class PostWeiboProcess {

private Activity activity;

public PostWeiboProcess(Activity activity) {

super();

this.activity = activity;

}

// 提交微博

public void process(PostWeiboTask task) throws Exception {

// 发布微博

WeiboManager.update(activity, Tools.getWeibo(activity), task.text, task.file);

}

}

这个就是发布微博的处理类,它有一个process方法,把发布微博的任务对象传入,这里的task就是在send()方面里面传入的,然后通过WeiboManager方法调用update的方法实现发布微博。

关于任务队列这一块是实现新浪微博最核心的,稍微有点复杂,下面我帮大家整理一下思路:

任务存储类:/xiaowu_twitter/src/com/wwj/sina/weibo/workqueue/WorkQueueStorage.java

这个类呢就是用来存储任务的,获取当前需要执行的任务,也用来移除执行完的任务列表,安装先进先出的方式实现任务按顺序执行,所以每次获取的任务就是放在最前面的,因为List的排列是顺序的。

package com.wwj.sina.weibo.workqueue;

import java.util.ArrayList;

import java.util.List;

/**

  • 任务存储

  • @author wwj

*/

public class WorkQueueStorage {

//  存储文件下载任务的List

private List webFileDoingList = new ArrayList();

// 存储通用任务的List, 所有任务都必须是ParentTask的子类

private List taskList = new ArrayList();

// 获取文件下载任务(要下载的URL)

public List getDoingWebFileUrls() {

// 进行同步

synchronized (webFileDoingList) {

if (webFileDoingList.size() > 0) {

List resultList = new ArrayList();

resultList.addAll(webFileDoingList);

return resultList;

} else {

return null;

}

}

}

// 删除文件下载队列中的任务

public void removeDoingWebFileUrl(List list) {

synchronized (webFileDoingList) {

if (list != null)

webFileDoingList.removeAll(list);

}

}

// 想文件下载队列添加任务(一个Url)

public void addDoingWebFileUrl(String url) {

synchronized (webFileDoingList) {

webFileDoingList.add(url);

}

}

// 目前必须只得到到一个任务,如果一下得到多个任务,需要修改WorkQueueMonitor类的代码

// 获取一个通用任务

public List getDoingTasks() {

synchronized (taskList) {

List result = new ArrayList();

if (taskList.size() > 0) {

result.add(taskList.get(0));

return result;

} else {

return null;

}

}

}

// 删除通用任务

public void removeTask(List tasks) {

synchronized (taskList) {

if (taskList.size() > 0) {

taskList.removeAll(tasks);

}

}

}

// 添加通用任务

public void addTask(Object task) {

synchronized (taskList) {

taskList.add(task);

}

}

}

我们通过调用addTask方法,把任务添加到任务列表当中,这个方法是线程同步的。

任务监视类:/xiaowu_twitter/src/com/wwj/sina/weibo/workqueue/WorkQueueMonitor.java

package com.wwj.sina.weibo.workqueue;

import java.util.Collection;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import android.app.Activity;

import android.os.Handler;

import android.os.Message;

import com.wwj.sina.weibo.interfaces.Const;

import com.wwj.sina.weibo.util.LogUtils;

import com.wwj.sina.weibo.workqueue.task.ParentTask;

/**

  • 任务监视

  • @author Lining 说明:除了任务存储外,还需要通过线程不断扫描保存的任务的List,一旦发现任务,立刻处理。

  •     这个工作交给WorkQueueMonitor类来完成
    

*/

public class WorkQueueMonitor implements Runnable, Const {

private WorkQueueStorage storage; // 任务存储

private Map<Integer, DoneAndProcess> doneAndProcessMap = new HashMap<Integer, DoneAndProcess>();

private DoingAndProcess doingAndProcess; // 处理任务接口对象

private Activity activity;

private boolean stopFlag = false; // 停止标识

private Thread thread; // 线程引用

private int monitorType = MONITOR_TYPE_IMAGE; // 监视类型,默认为图片

// 任务完成后,处理剩余的工作,主要是执行doneAndProcess方法

private Handler handler = new Handler() {

public void handleMessage(android.os.Message msg) {

ParentTask parentTask = (ParentTask) msg.obj;

// 如果任务本身有doneAndProcess方法,则执行此方法

if (parentTask != null && parentTask.doneAndProcess != null) {

parentTask.doneAndProcess.doneProcess(parentTask);

} else { // 否则由构造方法传入的doneAndProcess

Collection doneAndProcesses = doneAndProcessMap

.values();

for (DoneAndProcess doneAndProcess : doneAndProcesses) {

doneAndProcess.doneProcess(parentTask);

}

}

};

};

/**

  • 构造函数

  • @param activity

  •        窗口
    
  • @param storage

  •        任务存储对象
    
  • @param doingAndProcess

  •        正在处理的任务接口对象
    
  • @param monitorType

  •        监视类型
    

*/

public WorkQueueMonitor(Activity activity, WorkQueueStorage storage,

DoingAndProcess doingAndProcess, int monitorType) {

super();

this.activity = activity;

this.storage = storage;

this.doingAndProcess = doingAndProcess;

this.monitorType = monitorType;

}

// 开启线程

public void start() {

if (thread == null) {

thread = new Thread(this);

thread.start(); // 启动线程

}

}

// 停止线程

public void stop() {

stopFlag = true;

}

// 扫描文件下载任务队列

private void imageScan() {

LogUtils.i("+++ imageScan");

// 获取文件下载任务

List webFileDoingList = storage.getDoingWebFileUrls();

while (webFileDoingList != null) {

try {

// 处理文件下载任务

doingAndProcess.doingProcess(webFileDoingList);

handler.sendEmptyMessage(0);

} catch (Exception e) {

e.printStackTrace();

} finally {

// 删除已处理完的任务

storage.removeDoingWebFileUrl(webFileDoingList);

}

webFileDoingList = storage.getDoingWebFileUrls();

}

}

// 扫描通用任务

private void taskScan() {

List taskList = storage.getDoingTasks();

while (taskList != null) {

try {

doingAndProcess.doingProcess(taskList);

Message msg = new Message();

if (taskList.size() > 0) {

msg.obj = taskList.get(0);

}

handler.sendMessage(msg);

} catch (Exception e) {

e.printStackTrace();

} finally {

storage.removeTask(taskList);

}

taskList = storage.getDoingTasks();

}

}

@Override

public void run() {

while (!stopFlag) {

if (monitorType == MONITOR_TYPE_IMAGE) {

imageScan();

} else if (monitorType == MONITOR_TYPE_TASK) {

taskScan();

}

try {

// 每200毫秒扫描一次任务队列

Thread.sleep(200);

} catch (Exception e) {

e.printStackTrace();

}

}

}

public void addDoneAndProcess(int type, DoneAndProcess doneAndProcess) {

if (doneAndProcess != null) {

doneAndProcessMap.put(type, doneAndProcess);

}

}

}

任务队列如何实现?就是通过线程不断扫描任务列表,只要任务列表有任务就马上执行,关于任务会分两种,一种是图片下载任务,另一种是普通任务(发布微博、收藏微博、转发微博等)。当调用WorkQueueMonitor这个类的start方法就启动线程,然后执行run方法,根据不同任务类型执行任务。具体调用start方法的地方是在GlobalObject这个类里面。

/xiaowu_twitter/src/com/wwj/sina/weibo/GlobalObject.java

package com.wwj.sina.weibo;

import android.app.Activity;

import android.app.Application;

import com.weibo.net.Weibo;

import com.wwj.sina.weibo.interfaces.Const;

import com.wwj.sina.weibo.listener.AuthDialogListener;

import com.wwj.sina.weibo.net.PullFile;

import com.wwj.sina.weibo.object.Consumer;

import com.wwj.sina.weibo.workqueue.WorkQueueMonitor;

import com.wwj.sina.weibo.workqueue.WorkQueueStorage;

import com.wwj.sina.weibo.workqueue.task.TaskMan;

/**

  • 全局对象Application级别

  • @author Administrator

*/

public class GlobalObject extends Application implements Const {

// 调试开关

public static final boolean DEBUG = true;

private Weibo weibo;

// 任务存储

private WorkQueueStorage workQueueStorage;

// 图像下载监视器

private WorkQueueMonitor imageWorkQueueMonitor;

// 通用任务监视器

private WorkQueueMonitor taskWorkQueueMonitor;

/**

  • 获得微博对象

  • @param activity

  • @return

*/

public Weibo getWeibo(Activity activity) {

// 如果微博对象为null或者会话无效

if (weibo == null || !weibo.isSessionValid()) {

weibo = Weibo.getInstance(); // 获取Weibo对象

weibo.setupConsumerConfig(Consumer.consumerKey,

Consumer.consumerSecret);

weibo.setRedirectUrl(Consumer.redirectUrl);

// 授权认证

weibo.authorize(activity, new AuthDialogListener(activity));

}

return weibo;
t这个类里面。

/xiaowu_twitter/src/com/wwj/sina/weibo/GlobalObject.java

package com.wwj.sina.weibo;

import android.app.Activity;

import android.app.Application;

import com.weibo.net.Weibo;

import com.wwj.sina.weibo.interfaces.Const;

import com.wwj.sina.weibo.listener.AuthDialogListener;

import com.wwj.sina.weibo.net.PullFile;

import com.wwj.sina.weibo.object.Consumer;

import com.wwj.sina.weibo.workqueue.WorkQueueMonitor;

import com.wwj.sina.weibo.workqueue.WorkQueueStorage;

import com.wwj.sina.weibo.workqueue.task.TaskMan;

/**

  • 全局对象Application级别

  • @author Administrator

*/

public class GlobalObject extends Application implements Const {

// 调试开关

public static final boolean DEBUG = true;

private Weibo weibo;

// 任务存储

private WorkQueueStorage workQueueStorage;

// 图像下载监视器

private WorkQueueMonitor imageWorkQueueMonitor;

// 通用任务监视器

private WorkQueueMonitor taskWorkQueueMonitor;

/**

  • 获得微博对象

  • @param activity

  • @return

*/

public Weibo getWeibo(Activity activity) {

// 如果微博对象为null或者会话无效

if (weibo == null || !weibo.isSessionValid()) {

weibo = Weibo.getInstance(); // 获取Weibo对象

weibo.setupConsumerConfig(Consumer.consumerKey,

Consumer.consumerSecret);

weibo.setRedirectUrl(Consumer.redirectUrl);

// 授权认证

weibo.authorize(activity, new AuthDialogListener(activity));

}

return weibo;

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-01-25 10:42:32  更:2022-01-25 10:43:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:40:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码