參考:http://blog.csdn.net/lmj623565791/article/details/24015867



2、假设有个100M大的文件。须要上传至server中。而serverform表单最大仅仅能上传2M,能够用什么方法。

个人理解:所谓表单最大仅仅能上传2M。是不是指一个表单中附件仅仅能上传最大2M。假设是的话,如今要求上传100M,为什么不直接

把附件上传大小设置为100M就能够了,除此菜鸟的我,并想不出这个题目到底要考核面试者的什么知识点。

标准答案:这个问题不是非常明白我认为,首先来说使用http协议上传数据。特别在android下,跟form没什么关系。传统的在web中,在form中写文件上传,事实上浏览器所做的就是将我们的数据进行解析组拼成字符串。以流的方式发送到server,且上传文件用的都是POST方式,POST方式对大小没什么限制。回到题目。能够说如果每次真的仅仅能上传2M。那么可能我们仅仅能把文件截断,然后分别上传了。

二次理解:由于android程序中页面都是活动和碎片,跟form没有什么关系,仅仅有一个类似form的布局tablelayout,但跟form字面上都不是一回事所以android并不存在form表单说法,应该是指html中form表单。那么表单附件上传中首先把数据解析字符串文件以IO流的方式上传到server,并且并没有上传限制,假设有话,应该是什么原因,防止长时间占用server,减少效率。那么把文件截断上传还有意义嘛,这个问题不具备普遍性。所以不进行深究。

3、内存溢出和内存泄漏有什么差别?何时会产生内存泄漏?内存优化有哪些方法?

个人理解:不知道他们的差别。以为是同一件事情,比方内存中创建的对象过多时,导致内容空间不够,会产生该现象;及时关闭不必要的

资源,如数据库连接、IO流等,另外能够通过代码重构。尽可能降低对象的创建数量。

标准答案:

内存溢出通俗理解就是软件(应用)执行须要的内存,超出了它可用的最大内存。

内存泄漏就是我们对某一内存空间的使用,使用完毕后没有释放。

内存优化:Android中easy内存溢出的部分。就是图片的载入。我们可以使用图片的压缩加上使用LruCache缓存的目的来控制图片所可以使用的内存。还有对于比較耗资源的对象及时的关闭。比如Database
Conn , 各种传感器, Service等等。

二次理解:内存溢出指内存超出它可用的最大内容,而内存泄露则特指使用的资源没有释放。而内容中easy内存溢出的就是存储载入,使用压缩和缓存的方式,而内存泄露则须要及时关闭资源,比方数据连接、服务等。概念话的内容,并没有实际的參照价值,由于临时没有学习图片载入的使用

 4、AsyncTask使用在哪些场景?它的缺陷是什么?怎样解决?
                                        

个人理解:AsyncTask也是一种多线程的通信机制,可是AsyncTask并不须要去创建新的线程。把须要的操作直接定义在该对象的方法中就能够了,详细什么方法忘记。在第一行代码由于学习的Handler机制所以并没有加深对AsyncTask的理解,至于它的缺陷和解决方案更是不清楚了。

标准答案:

AsyncTask 运用的场景就是我们须要进行一些耗时的操作,耗时操作完毕后更新主线程,或者在操作过程中对主线程的UI进行更新。

缺陷:AsyncTask中维护着一个长度为128的线程池,同一时候能够运行5个工作线程。另一个缓冲队列。当线程池中已有128个线程,缓冲队列已满时。假设此时向线程提交任务,将会抛出RejectedExecutionException。

解决:由一个控制线程来处理AsyncTask的调用推断线程池是否满了,假设满了则线程睡眠否则请求AsyncTask继续处理。

二次理解:

AsyncTask与Handler机制类似,即异步消息处理机制,所谓异步,即是并行运行的意思,而多线程就是相互独立"同一时候"在运行,而AsyncTask相对与Handler机制的不同,他对Handler进行了封装。在使用时不须要走Handler的流程,直接在doInBackground()中定义相关方法,系统自己主动创建新子线程去运行。

AsyncTask与Handler机制是功能是相似的,能够用来在子线程中更新UI。或者下载耗时比較久的操作,比方下载文件由于主线程页面响应,即一个操作点击后,页面针对该操作做出反应的时间过长,那么Android系统会觉得是不友好的行为。该程序会直接崩溃。关于标准答案中AsyncTask能够维护一个长度为128的线程池,到底是什么概念,我能够理解为能够容纳128线程嘛?可是我能想象到的就是手机App眼下都是client本地的模式。即C/S模式。基本不存在一个用户在一个应用下打开128个下载内容,但不排除这个情况,然后运行5个工作线程的又是什么意思。与128是否冲突。还是概念上有什么区别(解答:所谓能够运行5个工作线程,长度为128的线程池,好比迅雷下载。你能够开启128个下载任务,可是它仅仅支持5个任务正在下载,超出的任务将进入缓冲区域,仅仅有当前5个任务完结时。才会从缓冲区域获取并运行新的任务,而超出128个任务时。则提示拒绝运行异常)。关于标准答案开辟一个子线程去监控线程缓冲区是否已满,假设满了。则让请求的线程的睡眠,可是睡眠的时间怎么设定?怎么实现线程缓冲区空暇时。睡眠停止的工作。

临时还没有找到更加具体资料。

使用介绍:因为本人对AsyncTask的使用没有很多其它的了解,所以这里会讲AsyncTask的简介和使用办法。

特点1:AsyncTask,是一个抽象类,所以要使用必需要创建一个子类就继承它。

特点2:AsyncTask,必须指定三个泛型參数,所谓类的泛型參数,能够觉得是java的一种指定类中所关联对象的详细类型做法,这样的做法的意义就是能够限制或者是明白了对象类型的范围,能够让编译器依据定义的泛型更加明白判定到内部代码的正确性。这是解决程序运行时多态转型异常的一种手段。參数列表为<Params,Progress,Result>,分别指传入的參数,能够在后台任务中使用;能够选择在前台显示当前进度。这里指定进度单位。任务运行完成后。假设须要对结果进行返回,则这里指定返回指的类型。

最简单的形式:class DownloadTask extendsAsyncTask<Void,Integer,Boolean>,见第一行代码。Void表示不传入參数。

特点3:AsyncTask方法介绍:

  1. onPreExecute:顾明思义,就是在运行子线程任务之前调用,不如我们要下载一个文件,能够在这里显示一个进度框。由于这是在主线程中运行的。

  2. doInBackground(Params):该方法就是后台操作的内容。系统会自己主动生成一个子线程去运行该方法中的内容,一些耗时的内容,比方下载一个文件的代码。该方法的參数和返回值类型和泛型中第二、三个相相应。由于这里是在子线程中运行的,假设须要对主线程中进度框更新,则须要调用publicProgress(Progress),该方法的调用自己主动引入第三个方法onProgressUpdate(Progress)的调用。
  3. onProgressUpdate(Progress),它的调用取决于doInBackground(Params)中是否调用了publicProgress(Progress)的方法,它的Progress參数也来源于publicProgress(Progress)中的參数,该方法事实上就是在主线中去更新进度。
  4. onPostExcuteResult(Result),该方法将在doInBackground(Params)运行完毕后运行,当中Result參数也来源于doInBackground方法的返回值,该方法能够运行对主线程的中UI的操作,比方关闭onPreExecute中创建的进度框,提示文件下载完毕等。

  5. excute(Params),在主线程创建这个AsyncTask子类的对象后,调用改方法,将启动异步运行的操作。


代码演示样例1:

UIActivity.xml

<pre name="code" class="java">package com.noodles.uipractice;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection; public class UIActivity extends AppCompatActivity { private TextView tv; private Button btn; private ProgressBar progressBar; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ui); tv = (TextView) findViewById(R.id.tv); progressBar = (ProgressBar) findViewById(R.id.progress_bar); btn = (Button) findViewById(R.id.send_text);
/**
* 4、给Button定义个点击事件。就是启动AsyncTask
* 当中execute的參数Params内容会自己主动传递给doInBackground的字符串数组类型的參数
*/
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new MyAsyncTask().execute("http://www.baidu.com");
}
});
}
/**
* 1、在主活动中中定义一个内部类MyAsyncTask继承AsyncTask
* 当然也能够不以内部类的形式。比方单独定义一个类或者用匿名内部类
* 不觉哪种定义方式更具有优势。由于单独定义分离后而代码结构更加清晰。 * 而匿名内部类和内部类更加贴近业务一体性。 */
class MyAsyncTask extends AsyncTask<String, Integer, String> { /**
* 2、复写doInBackground方法。该方法会开辟一个子线程去运行当中的代码
* 一般都是进行一些耗时的操作,这里能够去获取百度首页的内容
* <p/>
* String... params形式的參数列表,能够看做String[] params
*/
@Override
protected String doInBackground(String... params) {
BufferedReader br = null;
try {
//首先把百度的首页地址www.baidu.com。封装成URL,就比方在浏览器中用键盘输入www.baidu.com
URL url = new URL(params[0]);
//调用URL的openConnnection方法。就好比在浏览器的点击了回车
URLConnection connection = url.openConnection();
//假设没有以下这行话,则默认是调用GZIP的压缩技术。getContentLength()返回的就是-1
connection.setRequestProperty("Accept-Encoding", "identity");
//connection.connect();
long Total = connection.getContentLength();
/* 建立连接以后,形成了socket通道,以IO流的方式形成数据的流转,所谓IO流能够看作是计算机
* 全部媒介进行数据流转的一种固定形式,仅仅是刚好起了一个名字叫IO流。而我们建立连接后
* 默认是以get的方式想百度server请求数据,能够请求返回一个字节输入流,即InputStream,而我们知道,返回
* 的内容都是字符串,全部能够通过InputStreamReader,把字节流转换成字符流,由于java为字符流提供的方式
* 更加易用,同一时候java提供一个缓存区的BufferReader,本质就是数组,能够把单独的字符用大的容器装载后
* 再进行传输,这样降低了传输的回合。提高效率
*
*/
//调用connection的getInputStream能够获取server返回的字符流
InputStream inputStream = connection.getInputStream();
//调用InputStreamReader对象,能够把字节流转换为字符流
InputStreamReader isr = new InputStreamReader(inputStream);
//用BufferReader去装载字符流
br = new BufferedReader(isr);
//调用BufferedReader的方法,更便捷的获取请求的内容
//定义一个字符串变量用来接收BufferedReader的readLine方法读取的每一行数据
String line;
StringBuffer stringBuffer = new StringBuffer();
int count = 0;
while ((line = br.readLine()) != null) {
//读取的每一行数据都放在stringBuffer中
stringBuffer.append(line);
/**
* 5、对UI中已经定义的进度条进行更新,直接调用publishProgress方法
* 可是里面的參数类型必须和AsyncTask中声明的泛型一致,即Float
*/
count += line.length();
Integer value = (int) (count / (float) Total * 100);
publishProgress(value);
Thread.sleep(1000);
}
return stringBuffer.toString(); } catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (br != null) {
br.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
//假设运行期间发生异常,则返回null
return null;
} /**
* 3、复写onPostExecute,当中它的參数值来源于doInBackground的返回值
* 该方法能够更新主线程的UI,把返回的内容直接显示在主线程的TextView上
*/
@Override
protected void onPostExecute(String s) {
tv.setText(s);
Toast.makeText(UIActivity.this, "数据下载结束", Toast.LENGTH_SHORT).show();
} @Override
protected void onProgressUpdate(Integer... values) {
progressBar.setProgress(values[0]);
}
}
}

AndroidManifest.xml

<?

xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.noodles.uipractice" > <uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme" >
<activity android:name=".UIActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>

点击前:

点击后:



总结:AsyncTask是Android提供还有一种异步信息处理机制,明白的说就是多线程间的通讯,有别于Handler机制地方,它是Handler的封装所以在使用上面

更加的便捷,首先我们须要继承该类,复写里面的方法,必须复写就是doInBackground(Params)。该方法会创建一个子线程去运行方法中代码,所以一般用来

运行耗时的操作。比方下载文件。然后我们须要创建该子类的对象,并调用execute(Params)方法,当中參数Params由外部传入,该參数会自己主动传入oInBackground(Params)的參数,而且在AsyncTask的第一个泛型參数Params指定它的类型。第二泛型參数progress是指AsyncTask在doInBackground(Params)方法中能够调用publishProgress(progress),须要指定详细类型的值progress。系统会转而调用onProgressUpdate(progress)同一时候传入该数值,这种方法能够对主线程的UI进行更新,通常是用作更新进度条。

第三个參数Result,是指doInBackground(Params)方法运行后须要返回一个值,接着系统会调用onPostExecute(Result)。并把返回指传入这种方法,这种方法是运行一些收尾工作,把信息反馈给用户,比方更新主线程的UI,告诉用户下载已经完毕等。

參考内容:

见:【极客学院】-【网络通讯】-【异步任务处理】-【AsyncTask的用法】。

见:http://blog.csdn.net/liuhe688/article/details/6532519

Android面试准备 第一天 第2-4例的更多相关文章

  1. Android面试总结 (转)

    1. 下列哪些语句关于内存回收的说明是正确的? (b) A. 程序员必须创建一个线程来释放内存 B. 内存回收程序负责释放无用内存 C. 内存回收程序允许程序员直接释放内存 D. 内存回收程序可以在指 ...

  2. Android面试题目及其答案

    转自:http://blog.csdn.net/wwj_748/article/details/8868640 Android面试题目及其答案 1.Android dvm的进程和Linux的进程, 应 ...

  3. Android面试题目2

    1. 请描述下Activity的声明周期. onCreate->onStart->onRemuse->onPause->onStop->onRestart->onD ...

  4. 百度的android面试总结分析

    今天就是今天上午10点,我接到了百度的电话面试,当然提前和我说了,我的拖延症是有多强烈,以至于我没怎么准备,当然我也想着看看自己的真实水平,在此检讨一下!!!!!!!!!!!!!!!!!!!!!!!! ...

  5. 30K入职腾讯,全靠这份606页的Android面试指南

    前言 光阴似箭,日月如梭,时间真的过得飞快. 加上实习,从事 Android 开发,差不多有 5 年了.在上家公司职务.薪酬感觉已经到达了天花板,没有上升的余地.而且在这家公司过于安逸了,想换个有挑战 ...

  6. 一周内被程序员疯转3.2W次,最终被大厂封杀的《字节跳动Android面试手册》!

    一眨眼又到金三银四了,不知道各位有没有做好跳槽涨薪的准备了呢? 今天的话大家分享一份最新的<字节跳动Android面试手册>,内容包含Android基础+进阶,Java基础+进阶,数据结构 ...

  7. 【Android面试查漏补缺】之事件分发机制详解

    前言 查漏补缺,查漏补缺,你不知道哪里漏了,怎么补缺呢?本文属于[Android面试查漏补缺]系列文章第一篇,持续更新中,感兴趣的朋友可以[关注+收藏]哦~ 本系列文章是对自己的前段时间面试经历的总结 ...

  8. Android开发如何准备技术面试(含Android面试押题)

    今年毋庸置疑是找工作的寒冬,每一个出来找工作的同学都是值得尊敬的.现在找工作,虽然略难,但是反过来看也会逼迫我们成为更加优秀的自己. 但是不管是旺季还是寒冬,有一些优秀的同学找工作还是挺顺利的.所以说 ...

  9. 阿里、腾讯、百度、网易、美团Android面试经验分享,拿到了百度、腾讯offer

    基本情况 2021届普通本科,Android开发岗. 此文主要是2020年秋招面试经验汇总,最终拿到了百度.腾讯的offer. 主要包括阿里三面,腾讯四面,百度三面,网易三面,美团一场面完. 阿里(由 ...

随机推荐

  1. C#中Random

    说明:C#中的随机数是一个伪随机数,随机数字从一组有限的数字选择以相同的概率,所选的数字不是完全随机的,因为使用数学算法来选择它们.在大多数Windows系统中,Random的15毫秒内创建的对象很可 ...

  2. printf的字符型

    参  数 说  明 %s 按实际宽度输出一个字符串 %ms m指定宽度(不足时左补空格,大于时按实际宽度输出) %-ms 左对齐,不足时右补空格 %m.ns 输出占m个字符位置,其中字符数最多n个,左 ...

  3. Django总结二

    - 创建app应用与ORM操作 - Django项目project - app(应用) -> 不同的功能放在不同的app中 - 命令 : - 创建app python manage.py sta ...

  4. C与C艹的内存管理方式

    C 内存开辟出的空间一般可以分成:代码段,数据段(初始化的数据段, 为初始化的数据段BSS),堆,栈 代码段:保存程序文本,指令指针EIP就是指向代码段,可读可执行不可写 数据段:保存初始化的全局变量 ...

  5. Zookeeper概念学习系列之zookeeper的数据模型

    1.层次化的目录结构,命名符合常规文件系统规范. 2.每个节点在zookeeper中叫做znode,并且有其有一个唯一的路径标识. 3.znode中的数据可以有多个版本,比如某一路径下存有多个数据版本 ...

  6. linux php全能环境一键安装,小白福利!

    phpStudy Linux版&Win版同步上线 支持Apache/Nginx/Tengine/Lighttpd/IIS7/8/6 phpStudy for Linux 支持Apache/Ng ...

  7. Product Device Lot

    Product是指产品: 这个Product可以在不同的设备类型上生产, 同一类型的设备也可能硬件有差异,所以会有相对应的Device(Recipe): 同一Product(或同一Device)由于数 ...

  8. html5——盒子模式

    box-sizing属性 box-sizing: border-box;/*内减模式*/ box-sizing: content-box;/*外加模式(默认值)*/ box-sizing: paddi ...

  9. ionic下拉多项选择

    1.npm install ion-multi-picker --save 2.引入 import { MultiPickerModule } from 'ion-multi-picker'; imp ...

  10. 可以用作javascript异步模式的函数写法

    1. 回调函数 f1(); f2(); function f1(callback) { setTimeout(function() { // f1的任务代码 callback(); }, 1000); ...