感谢提供勘误信息的读者,正是有了你们,《Android进阶之光》才会变得越来越好。
注:小括号中的3印代表第3次印刷会修改的内容,依此类推。没有标注的就是首印和第2次印刷需要修改的内容。
目前最新版次:2018年10月 第8印。

第一章

  • 5页,第3、4行,RecyclerView布局添加了无效的属性,去掉第3、4行。
android:divider="#FFB900"
android:dividerHeight="1dp"
  • 8页,第15、16行,RecyclerView没有被应用到,去掉第15、16行。
android.support.v7.widget.RecyclerView v=new android.support.
v7.widget.RecyclerView(parent.getContext());
  • 8页(4印),倒数8行,mDivider.getIntrinsicHeight() 改为:mDivider.getIntrinsicWidth() 。
  • 9页,第10行,“getItemOffsets方法则用于设置item分割线的size。”改为:getItemOffsets方法则用于设置item的padding属性。
  • 10页 (5印)中间的段落会效率太低,应该把监听事件注册放入onCreateViewHolder方法中,改为如下代码:
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
View view=LayoutInflater.from(
mContext).inflate(R.layout.item_recycler, parent,
false);
MyViewHolder holder = new MyViewHolder(view);
view.setOnClickListener(this);
view.setOnLongClickListener(this);
return holder;
}
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position)
{
holder.itemView.setTag(position);
holder.tv.setText(mList.get(position));
}
@Override
public void onClick(View view) {
if (mOnItemClickListener != null) {
mOnItemClickListener.onItemClick(view,(int)view.getTag());
}
}
@Override
public boolean onLongClick(View view) {
if (mOnItemClickListener != null) {
mOnItemClickListener.onItemLongClick(view,(int)view.getTag());
}
return true;
}
  • 26页,倒数11行,去掉app:actionProviderClass=”android.support.v7.widget.ShareActionProvider”。

第二章

  • 55页(7印),第8行,这个View类型的参数是Snackbar的父控件,所以选择合适的父控件以确保Snackbar能显示在正确的位置上,改为:它可以是当前界面的任意一个View,Snackbar会使用这个View来查找用于展示Snackbar的最外层布局。
  • 78页,第4行,mageView 改为: ImageView。

第三章

  • 118页,第9行,result=super.onTouchEvent(ev) 改为: result=onTouchEvent(ev)。
  • 121页(4印),标题 ViewRootImpl的PerformTraveals方法 改为:ViewRootImpl的PerformTraversals方法
  • 143页(3印),倒数第6行;147页倒数第8行,改为:
canvas.drawRect(0 + paddingLeft, 0 + paddingTop, width + paddingLeft, height + paddingTop, mPaint);
  • 148页~179页(7印),148页最后一行,179页第一行,因为我们的组合控件整体布局是RelativeLayout,所以组合控件要继承RelativeLayout改为:这里的组合控件继承了RelativeLayout

第四章

  • 152页,第7行LineraLayout改为:LinearLayout。
  • 166页(3印),倒数第2行,“如果使用单个进程”改为:“如果使用单个线程”。倒数第5行,“把这个耗时的线程分配到一个单独的线程中去执行”改为:“把这个耗时的操作分配到一个单独的线程中去执行”。
  • 167页(3印),图 4-3 Object.join改为:Thread.join。
  • 170页(5印),倒数第二行,Thread.currentThread.interruupted(); 改为:Thread.currentThread.interrupt();
  • 182页(5印),倒数第5行, this改为:Singleton.class
  • 184页(7印),去掉7,8行,没有pull(time)。
  • 194页(7印),第12行,”采用了无界的阻塞队列LinkedBlockingQueue”有歧义,应该改为:采用了无界阻塞队列LinkedBlockingQueue(容量默认为Integer.MAX_VALUE)。

第五章

  • 222页(3印),倒数第4行,ImageLoader.ImageListener listener = ImageLoader.getImageListener改为:

    ImageLoader.ImageListener listener = ImageLoader.getImageListener(iv_image, R.drawable.ico_default, R.drawable.ico_default);
  • 223页(6印),第10行,android:id=”@+id/iv_image”;改为:android:id=”@+id/nv_image”
    第18行,iv_image = (ImageView) this.findViewById(R.id.iv_image) 改为: nv_image = (NetworkImageView) this.findViewById(R.id.nv_image);

  • 231页(6印),图5-12 最后一行,缓存调度线程从网络队列取出请求改为: 网络调度线程从网络队列取出请求。

  • 238页,第6行,private static OkHttpEngine mInstance;改为:private static volatile OkHttpEngine singleton;
    (3印)第2行, public abstract void onResponse(Response response) throws IOException;改为:public abstract void onResponse(String str) throws IOException;

  • 239页(3印)第12行 onResponse方法和sendSuccessCallback方法改为如下:

    @Override
    public void onResponse(Call call, Response response) throws IOException {
    sendSuccessCallback(response.body().string(), callback);
    }

    private void sendSuccessCallback(final String str, final ResultCallback callback) {
    mHandler.post(new Runnable() {
    @Override
    public void run() {
    if (callback != null) {
    try {
    callback.onResponse(str);
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    });
    }
  • 240页(3印),onResponse方法改为:

    @Override
    public void onResponse(String str) throws IOException{
    Log.d(TAG, str);
    Toast.makeText(getApplicationContext(), "请求成功", Toast.LENGTH_SHORT).show();
    }

  • 254页,第11行,“返回值大于0则是空闲连接,否则就是活跃连接。”改为:“返回值大于0则是活跃连接,否则就是空闲连接。”

第六章

  • 275页(3印),倒数第5行,倒数第16行,singleton改为:instance。倒数第2行,getSingleton方法 改为:getInstance方法。

第八章

  • 339页,倒数第6行,“第二个参数为終值,左闭右开。” 改为:“第二个参数为整数序列的个数。”
  • 343页,(5印)倒数第15行,goupBy改为:groupBy。
  • 351页,(5印)倒数第5行,最新数的数据是6 改为:最新的数据是3

第九章

  • 388页,最后1行,去掉最后的“;”
  • 402页:第7行,“接下来我们回到precess方法,我们从上面也知道了第400页注释1处的findAndParseTargets方法主要用于查找和解析注解。” 这句话表达不清楚,改为:“接下来回到第400页的process方法,我们已经知道了注释1处的findAndParseTargets方法主要用于查找和解析注解 。”

第十章

  • 423页(4印),第6行,MVVP改为:MVVM。
  • 442页(5印),倒数第12行,type=”Swordsman” 改为:type=”man”
  • 466页、467页,多处Source Insights改为:Source Insight。