Android仿人人客户端(v5,安卓大厂面试题

线程核心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)]
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值