日记--工作学习之路

日记--工作学习之路
----慢慢长大

             前言:从学习编程开始,我就不断的在质疑自己,因为我原本的理想是当个医生,还是中医,因为我觉得那样比较有韵味,所以从高中开始我就把自己的专业和以后的道路就定位为一名医生;我在课下会看一些中医的相关知识,看一些中医穴道,脉象,以及一些医书记载的一些病症。生活中也过得比较讲究,总想搞出中医的那一股韵味出来。
高考前的最后一个月,学习比较压抑,气氛比较沉闷,就买了一些杂志来看,我看到这么一篇文章。一位美国的小伙子大概十七岁,跟我差不多,十岁的时候开始搞编程,然后搞出了一个大概是新闻提取精华的一个软件(好像是这样,记不大清楚了;好像就是每天推荐的新闻有很多,看不过来,然后他搞的那个软件根据一定算法提取出一篇文章的主要语句呈现出来,大概就是这个意思),就这么一个软件,卖给了谁我忘了,然后得到了一个8位数的支票(美刀)。于是,我就眼红了,就这么一篇文章,我就转向了软件。
但是代价是很大的,首先我没怎么接触过电脑,我不爱玩游戏,所以基本很少去网吧,初中就去过一次,还是第一次去,只是听了会音乐就走了。高中去的次数一只手都可以数出来,而且还是一些正事才去,至于学校的电脑课,估计不少人都懂,也就那么回事,反正当时就只会开机关机,然后office都用不会。就这么一个电脑小白,我就决定往软件方面走。
还好当时我们班里也有一个钟情于这个专业的同学,还和我玩的不错。听我的想法后,他开始让我学五笔,说是打字快,当时我是拼音打字还是用手指点的那种,然后还给我带了一本电脑入门的书,书里主要讲一些硬件方面的东西,于是高考前我没动手。高考后我就买了一个键盘(电脑太贵买不起),买了一个五笔的口诀表和字典,就在那学,“王旁青头兼五一。。。”,真不好背,背了整整一天才背下来,然后又不会用。另外一个同学提醒我,背个毛线,搜狗也挺快的,我一想,你早说啊,我累死了都。
分数下来了,我的离一本差几分,那个同学差远了,二本都玄。我还不知道报考什么专业,自己就找软件、计算机等字眼,像计算机科学与技术,软件工程,还有一个问别人而知道的物联网,但我为了靠谱一点,软件都排在第一个,很走运,我被第一志愿录取了,然后专业也是软件工程。家里给我买了一台电脑,很苦逼,我不懂电脑,全看那推销员在那吹,我也不懂,我爸也不懂,然后就拿了个三千多的电脑,还好第一学期只用VC++,第二学期尼玛就坑比了,电脑卡的要死,然后换电脑,换装备,当然这是后来的事。
当时我还是有点动摇的,毕竟要进入一个自己什么都不知道的领域,还是有点露怯。如果当时我再多考个十分,我就去医学院了,也有点后悔,为什么当初没有去复读,复读一年说不定我就在医学院了。
来到学校时候,学的真是很痛苦,因为要联网,要办宽带(还是第一次),才有了第一个Android手机,以前用的是山寨的不能再山寨的那种直板,QQ都登不了,网页也卡的要死。然后同学们是各种装逼,什么二级,四级,什么各种编程语言,什么重装系统,什么软件等等。听不懂别人在说什么真的很痛苦,于是我干脆把那本C语言的书上的所有代码都手动的敲了好几遍。直到自己知道一些皮毛,二级考了四次才过,很多专业课的毕业设计都是跟着别人混,苦不堪言,因为不懂,悟性也差。现在,快毕业了,太多的也不说,也要步入毕业工作之路了。
让往事都随风,今天开始,记录学习之路,慢慢长大。



2017-01-11:

1,请求用GET还是POST(PUT、DELETE)要看清楚
今天公司那边传来一个接口,然后让我完成它在Android端的功能,开始的时候觉得思路没问题,一路写下来,发现怎么都是请求服务器失败,但是在postman上请求正常,然后另起一个程序,专门测试,搞了很长时间才发现是用get请求,而不是post,我因为看到后面有参数所以误解了。

2,ListView的item的点击事件
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                
                startActivity(new Intent(MainActivity.this, SecondActivity.class).putExtra("Content", adapter.getItem(position)));
            }
        });
这样可以,或者在Adapter中
viewHolder.text.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                context.startActivity(new Intent(context, SecondActivity.class).putExtra("Content", list.get(position).get("text")));
            }
        });
也可以
可是我把接受的字符串改为一个实体之后,在第一个就行不通了,第二个仍然可以
仍待思考。。。

临睡之前,又想到了这个问题,几番测试修改还是出了点问题,最终确定了问题的根源,第一个里面的adapter我没有
将它进行赋值性的初始化,所以他在这里始终是一个空引用,修改赋值之后,正常,但我个人觉得没有在Adapter里面
设置点击事件方便(就当前我目前的情况而言,一家之言),以后比较一下他们之间的区别和各自的优缺点。

3,将EditText的文字上传到服务器是要注意编码问题:
String str=URLEncoder.encode(""+s,"utf-8");
在Hander中也要设置一下

4,被TextWatcher监听之后,软件盘每次输入一个字,软件盘就隐藏一次,或者删除一个字,软件盘就隐藏一次,
开始在想是不是TextWatcher的问题,会不会页面的挺长的ListView变化时,导致了软件盘的隐藏,在网上搜索了
很长时间,没有找到我想要的答案,然后重新在另一个工作环境里测试了一下TextWatcher,发现是正常的,根本
就没有软件的依次隐藏问题。然后突然恍然大悟,软件盘的出现是因为有EditText的存在,也就是跟随者EditText
的焦点而存在,既然软件盘消失了,那当前的EditText的焦点也肯定消失了。然后发现我用了一个网络请求过程中
常用的Dialog提示,也就是Dialog把焦点给抢走了,果断去掉Dialog,发现一切正常。

嗯,晚安!


2017-01-12:

新的一天开始了,早上好哇!

1,前几天师傅让我注意一下ImageView加载图片出现OOM的问题,注意一下为什么?思考一下
我想这种情况无非就是图片占用的内存太大。但这样讲太广泛,不能够深入到细节,于是就到网上去找了一下相关内容,无非都是要减小图片的大小,或者压缩图片,或者用缓存,然后看到一篇鸿洋大神的一篇文章,觉得写的很好,他自己说是翻译的,翻译的也好。我整理了一下源码:

package com.example.test2;

import android.app.Activity;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.util.LruCache;
import android.widget.ImageView;

public class BaseActivity extends Activity {

	//缓存类
	private LruCache<String, Bitmap> mMemoryCache;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// 获取到可用内存的最大值,使用内存超出这个值会引起OutOfMemory异常。
		// LruCache通过构造函数传入缓存值,以KB为单位。
		int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
		// 使用最大可用内存值的1/8作为缓存的大小。
		int cacheSize = maxMemory / 8;
		mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
			@Override
			protected int sizeOf(String key, Bitmap bitmap) {
				// 重写此方法来衡量每张图片的大小,默认返回图片数量。
				return bitmap.getByteCount() / 1024;
			}
		};
	}

	public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
		if (getBitmapFromMemCache(key) == null) {
			mMemoryCache.put(key, bitmap);
		}
	}

	public Bitmap getBitmapFromMemCache(String key) {
		return mMemoryCache.get(key);
	}

	public void loadBitmap(int resId, ImageView imageView) {
		final String imageKey = String.valueOf(resId);
		final Bitmap bitmap = getBitmapFromMemCache(imageKey);
		if (bitmap != null) {
			imageView.setImageBitmap(bitmap);
		} else {
			imageView.setImageResource(R.drawable.qqq);
			BitmapWorkerTask task = new BitmapWorkerTask(imageView);
			task.execute(resId);
		}
	}

	class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {

		private ImageView imageView;

		public BitmapWorkerTask(ImageView imageView) {
			this.imageView = imageView;
		}

		@Override
		protected void onPreExecute() {
			imageView.setImageResource(R.drawable.ic_launcher);
		}

		@Override
		protected void onPostExecute(Bitmap result) {
			imageView.setImageBitmap(result);
		}

		// 在后台加载图片。
		@Override
		protected Bitmap doInBackground(Integer... params) {
			final Bitmap bitmap = BitmapUtils.decodeSampledBitmapFromResource(
					getResources(), params[0], 100, 100);
			addBitmapToMemoryCache(String.valueOf(params[0]), bitmap);
			return bitmap;
		}
	}

}

package com.example.test2;

import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

public class BitmapUtils {

	public static int calculateInSampleSize(BitmapFactory.Options options,
			int reqWidth, int reqHeight) {
		// 源图片的高度和宽度
		final int height = options.outHeight;
		final int width = options.outWidth;
		int inSampleSize = 1;
		if (height > reqHeight || width > reqWidth) {
			// 计算出实际宽高和目标宽高的比率
			final int heightRatio = Math.round((float) height
					/ (float) reqHeight);
			final int widthRatio = Math.round((float) width / (float) reqWidth);
			// 选择宽和高中最小的比率作为inSampleSize的值,这样可以保证最终图片的宽和高
			// 一定都会大于等于目标的宽和高。
			inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
		}
		return inSampleSize;
	}

	public static Bitmap decodeSampledBitmapFromResource(Resources res,
			int resId, int reqWidth, int reqHeight) {
		// 第一次解析将inJustDecodeBounds设置为true,来获取图片大小
		final BitmapFactory.Options options = new BitmapFactory.Options();
		options.inJustDecodeBounds = true;
		BitmapFactory.decodeResource(res, resId, options);
		// 调用上面定义的方法计算inSampleSize值
		options.inSampleSize = calculateInSampleSize(options, reqWidth,
				reqHeight);
		// 使用获取到的inSampleSize值再次解析图片
		options.inJustDecodeBounds = false;
		return BitmapFactory.decodeResource(res, resId, options);
	}

}

package com.example.test2;

import android.os.Bundle;
import android.widget.ImageView;

public class MainActivity extends BaseActivity {
	private ImageView image;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		image=(ImageView) findViewById(R.id.image);
		//Out Of Memory  OOM
//		image.setBackgroundResource(R.drawable.bbb);
		//解决姿势1
//		image.setImageBitmap(BitmapUtils.decodeSampledBitmapFromResource(getResources(), R.drawable.bbb,100,100));
		//解决姿势2
		loadBitmap(R.drawable.bbb, image);
	}
}

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <ImageView
        android:id="@+id/image"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/qqq" />

</RelativeLayout>

这里很好的解决了图片的压缩显示和缓存问题,但是我还不不太会用,我不知道那个key应该怎么搞,如果是在一个ListView中又该如何写入那个key,而且我已经被Glide惯坏了。他也有压缩和缓存的功能,而且是简单的加入依赖,然后链式调用,很是方便,如果不是师傅让我了解一个OOM,我都不知道这个。其实之前也看过这篇文章,那是在看大神介绍Volley的时候,他加入的一些文章的扫盲链接,点进去看的,但是没有上心,今天我贴出源码,这两天有时间就好好地深入研究一下。

2,在使用ConvenientBanner的时候,由于是公司的项目,师傅是直接把库搞进来弄成module,所以我就不能额外的导入它的依赖了,但是当初别人用过它一次,把他的指示器的位置给改掉了,目前我遇到的就是它的指示器距离底部非常远,看起来比较突兀,看了一下ConvenientBanner的源码,看到了设置指示器的大小以及间隔被改掉了,距离底部是在哪改的,我没找到,然后看到了另一个方法,设置指示器的方向:
/**
     * 指示器的方向
     * @param align  三个方向:居左 (RelativeLayout.ALIGN_PARENT_LEFT),居中 (RelativeLayout.CENTER_HORIZONTAL),居右 (RelativeLayout.ALIGN_PARENT_RIGHT)
     * @return
     */
    public ConvenientBanner setPageIndicatorAlign(PageIndicatorAlign align) {
        RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) loPageTurningPoint.getLayoutParams();
        layoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, align == PageIndicatorAlign.ALIGN_PARENT_LEFT ? RelativeLayout.TRUE : 0);
        layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, align == PageIndicatorAlign.ALIGN_PARENT_RIGHT ? RelativeLayout.TRUE : 0);
        layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL, align == PageIndicatorAlign.CENTER_HORIZONTAL ? RelativeLayout.TRUE : 0);
        loPageTurningPoint.setLayoutParams(layoutParams);
        return this;
    }

好像是默认居中的,于是我就稍微的加了一行代码:
    /**
     * 指示器的方向
     * @param align  三个方向:居左 (RelativeLayout.ALIGN_PARENT_LEFT),居中 (RelativeLayout.CENTER_HORIZONTAL),居右 (RelativeLayout.ALIGN_PARENT_RIGHT)
     * @return
     */
    public ConvenientBanner setPageIndicatorAlign(PageIndicatorAlign align) {
        RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) loPageTurningPoint.getLayoutParams();
        layoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, align == PageIndicatorAlign.ALIGN_PARENT_LEFT ? RelativeLayout.TRUE : 0);
        layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, align == PageIndicatorAlign.ALIGN_PARENT_RIGHT ? RelativeLayout.TRUE : 0);
        layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL, align == PageIndicatorAlign.CENTER_HORIZONTAL ? RelativeLayout.TRUE : 0);
        layoutParams.bottomMargin=Common.dip2px(getContext(),10);
        loPageTurningPoint.setLayoutParams(layoutParams);
        return this;
    }

Common是自定义的类,是为了适应不同的手机分辨率而用的,如果只是学习,直接就:
layoutParams.bottomMargin=10;
只不过,不同的手机,分辨率不同看到的就不一样了
3,在用ConvenientBanner的时候,多张图片在轮播,出现一个问题,有两张图片在前后轮播连在一块(详细点说,就是本来轮播是3s的,3s过一张图片,但是,在一秒钟前后连着轮播过去两张图片,然后停顿3秒钟,接着又是两张图片连着过去,太他妈恶心了 ),找了半天找不到原因,然后把自己的代码全部废掉,用公司项目之前的那个,发现他的正常,我就覆用他的,但是还是一样的效果,到底是看别人的代码头疼啊,只能自己去找原因,分析:
我发现我在请求完数据成功之后调用了这ConvenientBanner,也就是在onCreate函数的生命周期里面调用的,同时调用了
convenientBanner.startTurning(3000);让他来3s一次自动轮播,然后按照官方上的说法,在onResume中同样调用了他,在onStop中调
用了convenientBanner.stopTurning();方法;这样问题就来了,我在onCreate中调用了一次,紧接着在onResume中又调用了,这样不
就重了吗?调用两次是什么效果,会不会是在一个位置做两个图片轮播,然而两个生命周期函数的执行时间正好差了一张 图片的时
间而轮播时间却是3秒所以看不出差异?然后我将onResume中的轮播时长改为1s,果然,效果立马就出来了,一张跑的是整张,另一
张跑的是一小截,果然如此,目前我是这样理解的。于是将onCreate中的convenientBanner.startTurning(3000);给注释掉,反正
onResume也会执行,就不担心别的问题了。








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值