首页 文章 精选 留言 我的

精选列表

搜索[异步方法],共10000篇文章
优秀的个人博客,低调大师

Kubernetes环境下的各种调试方法

启动单个容器 不使用Pod或Replication Controller,启动单个容器: $ kubectl run webserver --image=nginx 想更改镜像,又不想升级版本? 每次修改之后,需要更新镜像的版本也好烦人啊。每次构建出新的镜像,Push到Docker Registry时,可以使用一个固定的版本,然后让Kubernetes在启动某个镜像时,无论本地是否有镜像,都去Docker Registry拉取镜像就好了。 ImagePullPolicy从默认的 IfNotPresent,改为 Always。 想直接修改容器里的程序,又不想更新镜像? 什么,还能这样做?在容器内部修改,比如修改了脚本,或者直接替换二进制程序,然后使用docker restart container-id。我尝试过此时使用docker commit提交修改,但是下次启动时,Kubernets就会报错。应该是有完整性校验的原因。 Pod重启了,如何看重启之前的日志? 下面的命令只能看到当前Pod的日志: $ kubectl logs zookeeper-1 通过 --previous参数可以看之前Pod的日志 $ kubectl logs zookeeper-1 --previous 查看Pod生命周期的事件 通过如下命令,看命令末尾 events 一节,查看kubelet给APIServer发送的Pod生命周期里发生的事件 $ kubectl describe pod podname 没有看到任何事件,但是Pod重启了? 依然通过describe命令,Containers.[*].Last State一节: $ kubectl describe pod podname Name: kafka-1 ... Containers: kafka: ... State: Running Started: Sat, 08 Apr 2017 02:29:04 +0000 Last State: Terminated Reason: OOMKilled Exit Code: 0 Started: Fri, 07 Apr 2017 11:06:56 +0000 Finished: Sat, 08 Apr 2017 02:29:04 +0000 Ready: True Restart Count: 1 ... 可以看到 Kafka-1 这个Container因为内存消耗太多,达到内存的上限(Memory Resource Limit)而被干掉了。如果看到 Reason: Completed,说明是容器内部pid为1的程序主动退出的。 查看资源(CPU/Memory)使用情况 资源使用最多的节点 $ kubectl top nodes 资源使用最多的Pod $ kubectl top pods 查看节点的资源使用情况 $ kubectl describe nodes | grep -A 2 -e "^\\s*CPU Requests" 如何摘下某个Pod进行Debug 使用label机制,对Pod进行标记。在Service定义中,我们添加 status: serving字段。当需要摘下某个Pod做Debug,而又不影响整个服务,可以: $ kubectl get pods --selector="status=serving" $ kubectl label pods webserver-rc-lxag2 --overwrite status=debuging 此时kubelet就会把这个Pod从Service的后端列表中删掉。等到Debug完,想恢复?再改回去就好了: $ kubectl label pods webserver-rc-lxag2 --overwrite status=serving References: 10 most common reasons kuberntes deployments fail Kubernetes Community Resources

优秀的个人博客,低调大师

android常用控件的使用方法

引言 xml很强大 TextView <TextView android:id="@+id/text_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:textSize="24sp" android:textColor="#00ff00" android:text="This is textview" /> Button 语法 <!-- textAllCaps避免全部变为大写 --> <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:textSize="24sp" android:textColor="#00ff00" android:text="This is textview" android:textAllCaps="false" /> 添加点击处理 1.第一种 package com.example.diandodo.helloworld; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; // 引入可以使用日志 import android.view.View; import android.widget.Button; public class HelloWorldActivity extends AppCompatActivity { private static final String TAG = "HelloWorldActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.hello_world_layout); Button button = (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d(TAG,"Click"); } }); } } 2.第二种 package com.example.diandodo.helloworld; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; // 引入可以使用日志 import android.view.View; import android.widget.Button; public class HelloWorldActivity extends AppCompatActivity implements View.OnClickListener{ private static final String TAG = "HelloWorldActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.hello_world_layout); Button button = (Button) findViewById(R.id.button); button.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.button: Log.d(TAG,"Click"); break; } } } EditText 允许用户输入和编辑内容 <EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="left" android:hint="Type something here" /> 小案例,点击获取内容 1.布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- textAllCaps避免全部变为大写 --> <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="点击获取" android:textAllCaps="false" /> <EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="left" android:hint="Type something here" android:maxLines="2" /> </LinearLayout> 2.业务 package com.example.diandodo.helloworld; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; // 引入可以使用日志 import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class HelloWorldActivity extends AppCompatActivity implements View.OnClickListener{ private static final String TAG = "HelloWorldActivity"; private EditText editText; // 定义一个全局变量 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.hello_world_layout); Button button = (Button) findViewById(R.id.button); editText = (EditText) findViewById(R.id.edit_text); button.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.button: String inputText = editText.getText().toString(); Toast.makeText(HelloWorldActivity.this,inputText,Toast.LENGTH_SHORT).show(); break; } } } ImageView 图片展示的控件。 图片通常放在以“drawable”开头的目录下。 <ImageView android:id="@+id/image_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/img_1" /> 小案例,点击更改图片 1.布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- textAllCaps避免全部变为大写 --> <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="点击获取" android:textAllCaps="false" /> <EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="left" android:hint="Type something here" android:maxLines="2" /> <Button android:id="@+id/button_change_img" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="点击改变图片" android:textAllCaps="false" /> <ImageView android:id="@+id/image_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/img_1" /> </LinearLayout> 2.业务 package com.example.diandodo.helloworld; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; // 引入可以使用日志 import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.Toast; public class HelloWorldActivity extends AppCompatActivity implements View.OnClickListener{ private static final String TAG = "HelloWorldActivity"; private EditText editText; // 定义一个全局变量 private ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.hello_world_layout); editText = (EditText) findViewById(R.id.edit_text); imageView= (ImageView) findViewById(R.id.image_view); Button button = (Button) findViewById(R.id.button); Button button_change_img = (Button) findViewById(R.id.button_change_img); button.setOnClickListener(this); button_change_img.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.button: String inputText = editText.getText().toString(); Toast.makeText(HelloWorldActivity.this,inputText,Toast.LENGTH_SHORT).show(); break; case R.id.button_change_img: imageView.setImageResource(R.drawable.img_2); break; } } } ProgressBar 进度条 <ProgressBar android:id="@+id/progress_bar" android:layout_width="match_parent" android:layout_height="wrap_content" /> 小案例,点击隐藏显示进度条 1.布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- textAllCaps避免全部变为大写 --> <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="点击获取" android:textAllCaps="false" /> <EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="left" android:hint="Type something here" android:maxLines="2" /> <Button android:id="@+id/button_change_img" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="点击改变图片" android:textAllCaps="false" /> <ImageView android:id="@+id/image_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/img_1" /> <Button android:id="@+id/button_set_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="点击显示隐藏" android:textAllCaps="false" /> <ProgressBar android:id="@+id/progress_bar" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> 2.业务 package com.example.diandodo.helloworld; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; // 引入可以使用日志 import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.Toast; public class HelloWorldActivity extends AppCompatActivity implements View.OnClickListener{ private static final String TAG = "HelloWorldActivity"; private EditText editText; // 定义一个全局变量 private ImageView imageView; private ProgressBar progressBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.hello_world_layout); editText = (EditText) findViewById(R.id.edit_text); imageView= (ImageView) findViewById(R.id.image_view); progressBar = (ProgressBar) findViewById(R.id.progress_bar); Button button = (Button) findViewById(R.id.button); Button button_change_img = (Button) findViewById(R.id.button_change_img); Button button_set_view = (Button) findViewById(R.id.button_set_view); button.setOnClickListener(this); button_change_img.setOnClickListener(this); button_set_view.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.button: String inputText = editText.getText().toString(); Toast.makeText(HelloWorldActivity.this,inputText,Toast.LENGTH_SHORT).show(); break; case R.id.button_change_img: imageView.setImageResource(R.drawable.img_2); break; case R.id.button_set_view: if (progressBar.getVisibility() == View.GONE) { progressBar.setVisibility(View.VISIBLE); // INVISIBLE } else { progressBar.setVisibility(View.GONE); } break; } } } 设为长的进度条 1.布局调整 <ProgressBar android:id="@+id/progress_bar" android:layout_width="match_parent" android:layout_height="wrap_content" android:max="100" style="?android:attr/progressBarStyleHorizontal" /> 2.业务处理 @Override public void onClick(View v) { switch (v.getId()) { case R.id.button: String inputText = editText.getText().toString(); Toast.makeText(HelloWorldActivity.this,inputText,Toast.LENGTH_SHORT).show(); break; case R.id.button_change_img: imageView.setImageResource(R.drawable.img_2); break; case R.id.button_set_view: // if (progressBar.getVisibility() == View.GONE) { // progressBar.setVisibility(View.VISIBLE); // INVISIBLE // } else { // progressBar.setVisibility(View.GONE); // } int progress = progressBar.getProgress(); progress = progress + 10; progressBar.setProgress(progress); break; } } 这样每次点击,都会增加进度。 AlertDialog 弹出对话框,置顶于所有界面元素之上。 AlertDialog.Builder dialog = new AlertDialog.Builder(HelloWorldActivity.this); dialog.setTitle("这是Dialog"); dialog.setMessage("一些重要的事情"); dialog.setCancelable(false); dialog.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog,int which) { } }); dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog,int which) { } }); dialog.show(); ProgressDialog 会在对话框中显示一个进度条,一般用于表示当前操作比较耗时,让用户耐心等待。 ProgressDialog progressDialog = new ProgressDialog(HelloWorldActivity.this); progressDialog.setTitle("这是progressDialog"); progressDialog.setMessage("Loading..."); progressDialog.setCancelable(true); progressDialog.show(); 本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/7499174.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android Butterknife 8.4.0 使用方法总结

转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/52983418 本文出自【赵彦军的博客】 前言 ButterKnife 简介 ButterKnife是一个专注于Android的View注入框架,可以减少大量的findViewById以及setOnClickListener代码,可视化一键生成。 项目github地址:https://github.com/JakeWharton/butterknife ButterKnife 优势 1、强大的View绑定和Click事件处理功能,简化代码,提升开发效率 2、方便的处理Adapter里的ViewHolder绑定问题 3、运行时不会影响APP效率,使用配置方便 4、代码清晰,可读性强 如何添加依赖 在项目的project 的build.gredle 文件中的dependencies标签下添加。 classpath ‘com.neenbedankt.gradle.plugins:android-apt:1.8’ 例如: buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.2.2' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' } } allprojects { repositories { jcenter() } } task clean(type: Delete) { delete rootProject.buildDir } 在module的build.gredle 文件中添加 apply plugin: ‘android-apt’ 在module的build.gredle 文件中的dependencies标签中添加 compile ‘com.jakewharton:butterknife:8.4.0’ apt ‘com.jakewharton:butterknife-compiler:8.4.0’ 例如 apply plugin: 'com.android.application' apply plugin: 'android-apt' android { compileSdkVersion 24 buildToolsVersion "24.0.3" defaultConfig { applicationId "com.zyj.wifi" minSdkVersion 14 targetSdkVersion 24 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.jakewharton:butterknife:8.4.0' apt 'com.jakewharton:butterknife-compiler:8.4.0' } 如何使用 控件id 注解: @BindView() package com.zyj.wifi; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Button; import butterknife.BindView; import butterknife.ButterKnife; public class ButterknifeActivity extends AppCompatActivity { @BindView( R.id.button1 ) public Button button1 ; // 注意:button 的修饰类型不能是:private 或者 static 。 否则会报错:错误: @BindView fields must not be private or static. (com.zyj.wifi.ButterknifeActivity.button1) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_butterknife); //绑定activity ButterKnife.bind( this ) ; button1.setText( "I am a button "); } } 多个控件id 注解: @BindViews() package com.zyj.wifi; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Button; import java.util.List; import butterknife.BindViews; import butterknife.ButterKnife; public class Main2Activity extends AppCompatActivity { @BindViews({ R.id.button1 , R.id.button2 , R.id.button3 }) public List<Button> buttonList ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); ButterKnife.bind(this); buttonList.get( 0 ).setText( "hello 1 "); buttonList.get( 1 ).setText( "hello 2 "); buttonList.get( 2 ).setText( "hello 3 "); } } fragment 使用 package com.zyj.wifi; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import butterknife.BindView; import butterknife.ButterKnife; public class ButterknifeFragment extends Fragment { @BindView( R.id.button1 ) public Button button1 ; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_butterknife, container, false); //绑定fragment ButterKnife.bind( this , view ) ; button1.setText( "I am a button "); return view ; } } @BindString() :绑定string 字符串 package com.zyj.wifi; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.Button; import butterknife.BindString; import butterknife.BindView; import butterknife.ButterKnife; public class ButterknifeActivity extends AppCompatActivity { @BindView( R.id.button1 ) //绑定button 控件 public Button button1 ; @BindString( R.string.app_name ) //绑定string 字符串 String meg; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_butterknife); //绑定activity ButterKnife.bind( this ) ; button1.setText( meg ); } } @BindArray() : 绑定string里面array数组 <resources> <string name="app_name">WiFi管家</string> <string-array name="city"> <item>厦门市</item> <item>福州市</item> <item>泉州市</item> <item>漳州市</item> <item>龙岩市</item> </string-array> </resources> package com.zyj.wifi; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.Button; import butterknife.BindArray; import butterknife.BindView; import butterknife.ButterKnife; public class ButterknifeActivity extends AppCompatActivity { @BindView( R.id.button1 ) //绑定button 控件 public Button button1 ; @BindArray(R.array.city ) //绑定string里面array数组 String [] citys ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_butterknife); //绑定activity ButterKnife.bind( this ) ; button1.setText( citys[0] ); } } @BindBitmap( ) : 绑定Bitmap 资源 package com.zyj.wifi; import android.graphics.Bitmap; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.ImageView; import butterknife.BindBitmap; import butterknife.BindView; import butterknife.ButterKnife; public class ButterknifeActivity extends AppCompatActivity { @BindView( R.id.imageView ) //绑定ImageView 控件 public ImageView imageView ; @BindBitmap( R.mipmap.wifi ) //绑定Bitmap 资源 public Bitmap wifi_bitmap ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_butterknife); //绑定activity ButterKnife.bind( this ) ; imageView.setImageBitmap( wifi_bitmap ); } } @BindColor( ) : 绑定一个颜色值 package com.zyj.wifi; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.Button; import butterknife.BindColor; import butterknife.BindView; import butterknife.ButterKnife; public class ButterknifeActivity extends AppCompatActivity { @BindView( R.id.button1 ) //绑定一个控件 public Button button1 ; @BindColor( R.color.colorAccent ) int black ; //绑定一个颜色值 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_butterknife); //绑定activity ButterKnife.bind( this ) ; button1.setTextColor( black ); } } @OnClick( ) : 绑定控件点击事件 @OnLongClick( ) : 绑定控件长按事件 package com.zyj.wifi; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.Toast; import butterknife.ButterKnife; import butterknife.OnClick; import butterknife.OnLongClick; public class ButterknifeActivity extends AppCompatActivity { @OnClick(R.id.button1 ) //给 button1 设置一个点击事件 public void showToast(){ Toast.makeText(this, "is a click", Toast.LENGTH_SHORT).show(); } @OnLongClick( R.id.button1 ) //给 button1 设置一个长按事件 public boolean showToast2(){ Toast.makeText(this, "is a long click", Toast.LENGTH_SHORT).show(); return true ; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_butterknife); //绑定activity ButterKnife.bind( this ) ; } } zelezny : Butterknife插件的使用 插件的安装 插件的使用 安装完成插件后,会提示重启AS,重启完后,可以写一个布局并且新建一个代码类测试下。测试的过程中要注意的是,需要将光标移到setContentView(R.layout.acty_login),将光标放到R.layout.acty_login,然后右键Generate就有了。要注意一定要将光标放在R.layout.acty_login上面。 这里需要注意的是在勾选控件的界面上,有一个CreateViewHolder , 很明显这个是专门为ListView或者RecyclerView的适配器专门提供的。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册