线程核心run()方法里面的实现:
@Override
public void run() {
try {
mInStream = getRequestResult();
if (mInStream != null) {
String result = new String(readInputStream(mInStream));
Object obj = parseHandler.parse(result);
requestCallback.onSuccess(flag, obj);
} else {
System.out.println("get InputStream By HttpURLConnection return result is NULL.");
}
} catch (IOException e) {
requestCallback.onFail(flag, Constant.NETWORK_REQUEST_IOEXCEPTION_CODE); // IO异常标识
e.printStackTrace();
}
}
二、通过HTTP协议发送GET请求的具体实现
package com.everyone.android.net;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Map;
import org.apache.http.protocol.HTTP;
import com.everyone.android.callback.ParseCallback;
import com.everyone.android.callback.ResultCallback;
/**
* 功能描述:通过HTTP协议发送GET请求
* @author android_ls
*
*/
public class AsyncHttpGet extends AsyncBaseRequest {
/**
*
*/
private static final long serialVersionUID = 2L;
public AsyncHttpGet(String url, Map<String, String> parameter,
ParseCallback handler, ResultCallback requestCallback) throws IOException {
super(url, parameter, handler, requestCallback);
}
@Override
protected InputStream getRequestResult() throws IOException {
StringBuilder sb = new StringBuilder(requestUrl);
sb.append('?');
for(Map.Entry<String, String> entry : parameter.entrySet()){
sb.append(entry.getKey()).append('=')
.append(URLEncoder.encode(entry.getValue(), HTTP.UTF_8)).append('&');
}
sb.deleteCharAt(sb.length()-1);
URL url = new URL(sb.toString());
mHttpURLConn = (HttpURLConnection)url.openConnection();
mHttpURLConn.setConnectTimeout(connectTimeout);
mHttpURLConn.setRequestMethod("GET");
if(mHttpURLConn.getResponseCode()== HttpURLConnection.HTTP_OK){
return mHttpURLConn.getInputStream();
}
return null;
}
}
三、通过HTTP协议发送POST请求的具体实现
package com.everyone.android.net;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Map;
import org.apache.http.protocol.HTTP;
import com.everyone.android.callback.ParseCallback;
import com.everyone.android.callback.ResultCallback;
/**
* 功能描述:通过HTTP协议发送POST请求
* @author android_ls
*
*/
public class AsyncHttpPost extends AsyncBaseRequest {
/**
*
*/
private static final long serialVersionUID = 3L;
public AsyncHttpPost(String url, Map<String, String> parameter,
ParseCallback handler, ResultCallback requestCallback) {
super(url, parameter, handler, requestCallback);
}
@Override
protected InputStream getRequestResult() throws IOException {
StringBuilder sb = new StringBuilder();
if(parameter!=null && !parameter.isEmpty()){
for(Map.Entry<String, String> entry : parameter.entrySet()){
sb.append(entry.getKey()).append('=')
.append(URLEncoder.encode(entry.getValue(), HTTP.UTF_8)).append('&');
}
sb.deleteCharAt(sb.length()-1);
}
// 得到实体的二进制数据
byte[] entitydata = sb.toString().getBytes();
URL url = new URL(requestUrl);
mHttpURLConn = (HttpURLConnection)url.openConnection();
mHttpURLConn.setRequestMethod("POST");
mHttpURLConn.setConnectTimeout(5 * 1000);
// 如果通过post提交数据,必须设置允许对外输出数据
mHttpURLConn.setDoOutput(true);
mHttpURLConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
mHttpURLConn.setRequestProperty("Content-Length", String.valueOf(entitydata.length));
OutputStream outStream = mHttpURLConn.getOutputStream();
outStream.write(entitydata);
outStream.flush();
outStream.close();
if(mHttpURLConn.getResponseCode()== HttpURLConnection.HTTP_OK){
return mHttpURLConn.getInputStream();
}
return null;
}
}
四、线程池类
package com.everyone.android.net;
import java.util.concurrent.AbstractExecutorService;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import android.util.Log;
/**
* 功能描述:网络请求线程池类
* @author android_ls
*/
public class DefaultThreadPool {
/**
* 用于保存等待执行的任务的阻塞队列。(有序的先进先出阻塞队列)
*/
private static ArrayBlockingQueue<Runnable> mBlockingQueue = new ArrayBlockingQueue<Runnable>(15, true);
/**
* 线程池
*/
private static AbstractExecutorService mThreadPoolExecutor
= new ThreadPoolExecutor(5, 7, 10, TimeUnit.SECONDS, mBlockingQueue,
new ThreadPoolExecutor.DiscardOldestPolicy());
private static DefaultThreadPool instance = null;
public static DefaultThreadPool getInstance() {
if (instance == null) {
instance = new DefaultThreadPool();
}
return instance;
}
/**
* 执行任务
* @param r
*/
public void execute(Runnable r) {
mThreadPoolExecutor.execute(r);
}
/**
* 关闭,并等待任务执行完成,不接受新任务
*/
public static void shutdown() {
if (mThreadPoolExecutor != null) {
mThreadPoolExecutor.shutdown();
Log.i(DefaultThreadPool.class.getName(), "DefaultThreadPool shutdown");
}
}
/**
* 关闭,立即关闭,并挂起所有正在执行的线程,不接受新任务
*/
public static void shutdownRightnow() {
if (mThreadPoolExecutor != null) {
mThreadPoolExecutor.shutdownNow();
try {
// 设置超时极短,强制关闭所有任务
mThreadPoolExecutor.awaitTermination(1, TimeUnit.MICROSECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i(DefaultThreadPool.class.getName(), "DefaultThreadPool shutdownRightnow");
}
}
}
五、网络请求返回的数据解析接口
package com.everyone.android.callback;
/**
* 功能描述:网络请求返回的数据解析接口
* @author android_ls
*
*/
public interface ParseCallback {
/**
* 对网络请求返回的数据进行解析
* @param str 要解析的字符串,JSON格式或XML
* @return 解析的结果
*/
public Object parse(String str);
}
六、网络请求返回的结果回调接口
package com.everyone.android.callback;
/**
* 功能描述:网络请求返回的结果回调接口
* @author android_ls
*
*/
public interface ResultCallback {
public void onSuccess(Object obj);
public void onFail(int errorCode);
}
七、应用中界面(Activity)的基类
package com.everyone.android;
import java.net.HttpURLConnection;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.Toast;
import com.everyone.android.net.AsyncBaseRequest;
import com.everyone.android.net.DefaultThreadPool;
/**
* 功能描述:应用中界面(Activity)的基类
* 对原有的Activity类进行扩展
* @author android_ls
*/
public abstract class AppBaseActivity extends Activity {
/**
* 当前activity所持有的所有网络请求
*/
protected List<AsyncBaseRequest> mAsyncRequests;
protected Handler mHandler;
protected DefaultThreadPool mDefaultThreadPool;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getLayoutId());
((EveryoneApplication) this.getApplication()).addActivity(this);
mHandler = new Handler();
mAsyncRequests = new ArrayList<AsyncBaseRequest>();
mDefaultThreadPool = DefaultThreadPool.getInstance();
// 初始化组件
setupView();
// 初始化数据
initializedData();
}
/**
* 布局文件ID
* @return
*/
protected abstract int getLayoutId();
/**
* 初始化组件
*/
protected abstract void setupView();
/**
* 初始化数据
*/
protected abstract void initializedData();
@Override
protected void onPause() {
/**
* 在activity销毁的时候同时设置停止请求,停止线程请求回调
*/
cancelRequest();
super.onPause();
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
**因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/c2ba49b445e4ad3b7ee45300ec3d87da.png)
![img](https://img-blog.csdnimg.cn/img_convert/594c78a79de00f6918a7b4a399ff8933.png)
![img](https://img-blog.csdnimg.cn/img_convert/f5709419ec6fd5d42f82caeb514b6ba0.png)
![img](https://img-blog.csdnimg.cn/img_convert/b6a16b1235db178676bb389ec5df6702.png)
![img](https://img-blog.csdnimg.cn/img_convert/8f34cb7eec970f1a2789aea890a93322.png)
![img](https://img-blog.csdnimg.cn/img_convert/07012aa75a769118b7d3c7361de600d8.png)
![img](https://img-blog.csdnimg.cn/13f2cb2e05a14868a3f0fd6ac81d625c.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)**
![img](https://img-blog.csdnimg.cn/img_convert/08fa2e5676f48fcbf0e221a273ca3eb0.png)
### 最后
**针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!**
> **往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、混合式开发(ReactNative+Weex)全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。**
![](https://img-blog.csdnimg.cn/img_convert/ef55684ac9a08a4d9c2a6d279dd17bde.webp?x-oss-process=image/format,png)
![](https://img-blog.csdnimg.cn/img_convert/0a18390f9072055274757a5b69f5ae19.webp?x-oss-process=image/format,png)
**一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
![img](https://img-blog.csdnimg.cn/img_convert/56a3d44c290358b8c0210de349a3e8bd.png)
roid开发知识点,真正体系化!**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)**
[外链图片转存中...(img-ZPXknXEA-1712773298610)]
### 最后
**针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!**
> **往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、混合式开发(ReactNative+Weex)全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。**
[外链图片转存中...(img-onIk5Quq-1712773298610)]
[外链图片转存中...(img-6VHAwjbc-1712773298610)]
**一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
[外链图片转存中...(img-N3P9uFXR-1712773298611)]