okhttp调https
如果后台使用的https证书为认证过的,那前端只需要将http://换成https://即可。否则,前端需要信任后台提示的证书才能继续访问。代码如下:
public void setCertificates(InputStream... certificates) {
try {
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null);
int index = 0;
for (InputStream certificate : certificates) {
String certificateAlias = Integer.toString(index++);
keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(certificate));
try {
if (certificate != null)
certificate.close();
} catch (IOException e) {
e.printStackTrace();
}
}
SSLContext sslContext = SSLContext.getInstance("TLS");
TrustManagerFactory trustManagerFactory =
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);
sslContext.init
(
null,
trustManagerFactory.getTrustManagers(),
new SecureRandom()
);
mOkHttpClient.setSslSocketFactory(sslContext.getSocketFactory());
} catch (Exception e) {
e.printStackTrace();
}
}
其中参数为后台提供的cer文件的流。再使用时,使用mOkHttpClient去进行网络访问即可。子线程更新UI
win10下adb无法连接设备
在win10下,adb能成功打开,只是adb devices显示的是空的。原文解决办法。打开设备管理器,连接上之后的列表如下:
内存溢出与内存泄漏
复制粘贴
ClipboardManager.OnPrimaryClipChangedListener mPrimaryChangeListener
= new ClipboardManager.OnPrimaryClipChangedListener() {
public void onPrimaryClipChanged() {
updateClipData(true);
}
};
ClipboardManager mClipboard = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);
mClipboard.addPrimaryClipChangedListener(mPrimaryChangeListener);
它常用方法如下:
getPrimaryClip():从剪贴板中获取数据,返回一个ClipData对象。
ClipData
ClipData data = ClipData.newRawUri("LABEL",Uri.parse("http://www.baidu.com/"));
ClipData.Item item = new ClipData.Item("html","<b>html</b>");
data.addItem(item);
manager.setPrimaryClip(data);
此时粘贴的内容将公是http://www.baidu.com/[换行]html(文字加粗)。这是因为该data中有两个item,每一个item存储了一条数据。
Item
示例
ClipData data = ClipData.newRawUri("LABEL",Uri.parse("http://www.baidu.com/"));
ClipData.Item item = new ClipData.Item("html","<b>html</b>");
data.addItem(item);
ClipData.Item item1 = new ClipData.Item("text");
data.addItem(item1);
ClipData.Item item2 = new ClipData.Item(new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.google.com/")));
data.addItem(item2);//为一次复制添加多个item。
manager.setPrimaryClip(data);//设置到系统中
ClipData clip = manager.getPrimaryClip();
for(int x = 0;x<clip.getItemCount();x++){
ClipData.Item at = clip.getItemAt(x);
switch (x){
case 0:
Log.e(TAG,"0="+at.getUri().toString());//第一个是通过newRawUri创建的item,所以获取时只能通过getUri。如果使用getText()等方法,将会返回null
break;
case 1:
Log.e(TAG,"1="+at.getHtmlText()+",c = "+at.coerceToHtmlText(MainActivity.this));
break;
case 2:
Log.e(TAG,"2="+at.getText());
break;
case 3:
Log.e(TAG,"3="+at.getIntent().toUri(0));
break;
}
}
multidex
每一个dex文件最多只能有65536个方法,多了就是出异常。解决办法将一个dex文件分解成多个dex文件。不幸的是,低版本的android系统中不支持多个dex文件(而5.0以上是自动支持的),但官方又提供有相应的support包。
第一步:修改module级的gradle文件,如下:
android {
compileSdkVersion 21
buildToolsVersion "21.1.0"
defaultConfig {
...
minSdkVersion 14
targetSdkVersion 21
...
// Enabling multidex support.
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.0'
}
第二步:修改Application。如果没有自定义的Application,那只需要修改清单文件如下:<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.multidex.myapplication">
<application
...
android:name="android.support.multidex.MultiDexApplication">
...
</application>
</manifest>
其中name属性指定引用support包中的MultiDexApplication。如果自身已经定义过了Application,那么重写attachBaseContext()方法将调用MultiDex.install(this)。
日间模式与夜间模式
方法一:设置不同的theme。参考
方法二:使用v7中自带的功能。方法如下:
1,Activity要继承AppCompatActivity;2,Activity的theme为Theme.AppCompat.DayNight或其子类;3,通过如下示例的代码进行日夜切换:
public void setModeNightNo(View view) {
getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_NO);//日间模式
recreate();
}
public void setModeNightYes(View view) {
getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_YES);//夜间模式
recreate();
}
public void setModeNightAuto(View view) {
getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_AUTO);//自动
recreate();
}
这种方式也可用在dialog上,只不过dialog的创建得使用v7包中的AppCompatDialog。如下:
AppCompatDialog dialog = new AppCompatDialog(this, R.style.Theme_AppCompat_DayNight_Dialog);
dialog.getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_AUTO);
dialog.setTitle(R.string.dialog_title);
dialog.setContentView(R.layout.dialog_content);
dialog.show();
虽然这种切换方式比较简单,但它不如上面的一个灵活:上面一个可以设置成想要设置的颜色,并且可以实现多个主题。而下面的处理全部是系统自动完成,只有两种主题。
几个线程的比较
android提供了几个关于线程操作的类:AsyncTask,HandlerThread,IntentService,再加上Java自向的Executor。一共四个。
1,AsyncTask默认是串行的,因此,它适合执行起来比较迅速的任务。但它的操作简单。
2,IntentService,启动一个Service,并在线程中执行每一个Intent。因此,它适合执行长期任务,并且其优先级比普通的后台线程要高。
3,HandlerThread,比较灵活。
4,Executor:线程池,需要多个线程并发执行时用。
大部分情况下都可用AsyncTask,但它本身就有一些限制,如:一个对象只能执行一次,内容采用的是线程池技术,所以有可能不同的AsyncTask执行在不同的线程中。如果说需要为某些连接执行的任务提供一个单独的线程,使用HandlerThread比AsyncTask合适。
无论是采用哪一种线程,在Activity结束时都需要保证线程能正常结束,因为线程持有一个Activity的引用,如果它不结束将会导致Activity无法被回收,从而内存泄漏。
另外,在使用线程时,需要考虑自己线程的优先级。应根据业务进行调整。
mac下插入环境变量
1,打开terminal(终端),输入vim ~/.bash_profile(该文件用来配置个人的环境变量)。
2,按i键,即在vim中进入插入模式,可以进行修改。
3,按esc键,退出个性,并输入:wq后保存退出