Xutils3

Xutils由于内部使用httpclient然而在安卓5.0谷歌发现httpclient出现不稳定的情况.于6.0完全弃用,所以作者升级到Xutils3替换原本网络模块

配置环境(Studio):

在build.gradle添加依赖

dependencies {
compile 'org.xutils:xutils:3.3.36'
}

以下就Xutils3的四个模块分别给出案例:

  • View模块:

    简化开发者 写findViewId和设置布局等冗余代码等

    • 在activity使用案例
    package qianfeng.com.day36_xutils;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.Toast; import org.xutils.view.annotation.ContentView;
    import org.xutils.view.annotation.Event;
    import org.xutils.view.annotation.ViewInject;
    import org.xutils.x; /*
    xUtils3 的View 框架
    目的: 减少代码量 使用方式:
    1.在onCreate方法中 初始化 View模块
    x.view().inject();
    2.不需要添加findViewById方法
    在引用上面添加 @ViewInject(ViewId) 即可使用
    3.可以省略 setContentView方法
    需要在 Activity 上  添加
    @ContentView(LayoutId)
    4.点击事件注解
    创建方法  必须是 私有
    private void onClick(View view){}
    在该方法上面添加
    @Event(ViewId)
    @Event({ViewId数组})
    @Even( value = ViewId)
    @Even(value = {ViewID数组})
    不需要在 xml文件中添加 onClick 属性
    5.注意!
    在使用过程中 必须先执行 x.view().inject 方法
    在使用过程中 不允许出现重复Id 养成习惯
    */
    @ContentView(R.layout.activity_view)
    public class ViewActivity extends AppCompatActivity { @ViewInject(R.id.view_tv)
    private TextView tv; @ViewInject(R.id.view_bt)
    private Button view_bt; @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // View View = LayoutInflater.from(this).inflate(R.layout.activity_view, null);
    // setContentView(View);
    x.view().inject(this); tv.setText("今天天气 好晴朗~");
    } // 点击事件
    @Event(value = {R.id.view_bt, R.id.view_tv})
    private void onClick(View view) {
    switch (view.getId()) {
    case R.id.view_bt:
    Toast.makeText(ViewActivity.this, "大家注意防雾霾", Toast.LENGTH_SHORT).show();
    break;
    case R.id.view_tv:
    Toast.makeText(ViewActivity.this, "骗谁呢,雾霾天", Toast.LENGTH_SHORT).show();
    break;
    }
    } }
    • 对应布局文件
    <?xml version="1.0" encoding="utf-8"?>
    <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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".ViewActivity"> <TextView
    android:id="@+id/view_tv"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="处处好风光"
    android:textSize="20sp" /> <Button
    android:id="@+id/view_bt"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:text="Button" /> <fragment
    android:id="@+id/view_fragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    class="qianfeng.com.day36_xutils.fragment.ViewFragment"
    android:layout_below="@id/view_bt" />
    </RelativeLayout>
  • Fragment 使用案例 先写个基础BaseFragment让子类继承
    • BaseFragment (无对应界面)
package qianfeng.com.day36_xutils.fragment;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup; import org.xutils.x; /**
*Fragment 中 使用注解
* 1.在onCreateView 方法中
* return x.view().inject(this,inflater,container)
* 2.定义标记
* isInject 记录是否有 被初始化过
* 3.在 onCreateView 方法 中将 变量标记为 true
* 4.在 onViewCreated 方法中 判断 是否被 初始化过
* 如果没有
* 则
* x.view().inject(this,getView())即可
* 5.封装BaseFragment 继承后 可 省略 onCreateView 方法的重写
* 6.需要在 类的上方添加 @ContentView(FragmentLayoutId) */
public class BaseFragment extends Fragment { private boolean isInject = false;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
isInject = true;
// View view = inflater.inflate(R.layout.fragment_base, container, false);
return x.view().inject(this,inflater,container);
} @Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (!isInject){
x.view().inject(this,getView());
}
}
}

子类fragment:

package qianfeng.com.day36_xutils.fragment;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast; import org.xutils.view.annotation.ContentView;
import org.xutils.view.annotation.Event;
import org.xutils.view.annotation.ViewInject; import qianfeng.com.day36_xutils.R; @ContentView(R.layout.fragment_view)
public class ViewFragment extends BaseFragment { @ViewInject(R.id.fragemnt_tv)
TextView fragment_tv; @Event(R.id.fragemnt_tv)
private void onClick(View view) {
Toast.makeText(getActivity(), "弹弹弹", Toast.LENGTH_SHORT).show();
} @Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
fragment_tv.setText("实例化数据");
}
}
  • 子类对应布局
<FrameLayout 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="qianfeng.com.day36_xutils.fragment.ViewFragment"> <!-- TODO: Update blank fragment layout -->
<TextView
android:id="@+id/fragemnt_tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/hello_blank_fragment" /> </FrameLayout>
  • 在适配器中使用

@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = inflater.inflate(R.layout.item_layout, parent, false);
holder = new ViewHolder();
// 初始化View
x.view().inject(holder, convertView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
} holder.item_name_tv.setText(list.get(position).getName());
holder.item_age_tv.setText(list.get(position).getAge());
holder.item_sex_tv.setText(list.get(position).getSex()); return convertView;
} static class ViewHolder { @ViewInject(R.id.item_name_tv)
TextView item_name_tv;
@ViewInject(R.id.item_age_tv)
TextView item_age_tv;
@ViewInject(R.id.item_sex_tv)
TextView item_sex_tv;
}

  • Imga 模块

注意初始化:初始化一般application中如下

package com.example.app;

import android.app.Application;

import org.xutils.x;

/**
* Created by Administrator on 2016/10/17.
*/ public class Myapplication extends Application { @Override
public void onCreate() {
super.onCreate();
x.Ext.init(this);
x.Ext.setDebug(true);//打开日志信息 不属于初始化 发布时可以删除 影响性能
}
}
package qianfeng.com.day36_xutils;

import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView; import org.xutils.image.ImageOptions;
import org.xutils.view.annotation.ContentView;
import org.xutils.view.annotation.Event;
import org.xutils.view.annotation.ViewInject;
import org.xutils.x; import java.io.File; @ContentView(R.layout.activity_image)
public class ImageActivity extends AppCompatActivity { @ViewInject(R.id.show_iv)
private ImageView show_iv; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_image);
x.view().inject(this);
// 通过 这个 管理者加载 Assets 文件中的 资源
// AssetManager
} @Event({R.id.file_bt, R.id.sd_bt, R.id.http_bt})
private void onClick(View view) {
switch (view.getId()) {
case R.id.file_bt:
// 图片 处理参数配置
ImageOptions.Builder builder = new ImageOptions.Builder();
builder.setIgnoreGif(false);// 设置 不要忽略 Gif图片 默认是 true 不支持
builder.setLoadingDrawableId(R.mipmap.ic_launcher); // 加载的时候显示的图片
builder.setFailureDrawableId(R.mipmap.ic_launcher);// 加载失败的时候显示的图片
x.image().bind(show_iv, "assets://cat.gif", builder.build());
break;
case R.id.sd_bt:
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
String path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "qq.png"; TranslateAnimation animation = new TranslateAnimation(0, 200, 0, 200);
animation.setDuration(10000); ImageOptions options = new ImageOptions.Builder()
.setUseMemCache(true)//使用缓存 默认为ture 如果为false每次都会从文件中读取 动画也会执行多次 为ture只会执行一次动画
// .setCircular(true)//使这个图片变成个圆
.setRadius(20)// 设置圆角角度
.setCrop(true)// 设置是否填充大小 如果图片是100 *100 现在设置200,200 如果此选项为false那么保持原图大小
// .setSize(200,200)
.setAnimation(animation) // 添加加载后执行的 动画
.setAutoRotate(true)// 自动旋转
.setConfig(Bitmap.Config.RGB_565)// 每个像素的 格式
.build(); //必须初始化 x.Ext.init(getApplication()); 此案例已经写在application类中
x.image().bind(show_iv, path, options);
} break;
case R.id.http_bt:
x.image().bind(show_iv, "http://img5.duitang.com/uploads/item/201510/01/20151001014728_tmHdG.jpeg");
break;
}
} }

数据库模块(ROM):

package com.example.app;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast; import org.xutils.DbManager;
import org.xutils.db.annotation.Column;
import org.xutils.db.annotation.Table;
import org.xutils.db.sqlite.WhereBuilder;
import org.xutils.ex.DbException;
import org.xutils.view.annotation.ContentView;
import org.xutils.view.annotation.Event;
import org.xutils.view.annotation.ViewInject;
import org.xutils.x; import java.util.ArrayList;
import java.util.List; @ContentView(R.layout.activity_db)
public class DBActivity extends AppCompatActivity { @ViewInject(R.id.lv)
ListView lv;
private DbManager db;
private ArrayAdapter<String> adapter;
private List<String> dataText;
/**
* 数据库建表
* 1.在类名上面写上@Table(name = "TableName")
* 2.在属性上面添加 @Colum(name = "columName" )
* isId 是否是主键
* autoGen 自增长 默认 true
* 3.构造方法必须全写有参构造以及 无参构造
*
*
*
*
* Created by ${Mr.Zhao} on 2016/10/17.
*/
//自动创建对应的表
@Table(name="Student")
static class Student{
//name = xxx 谁知对应在数据库的字段名
// isId 是否为主键
//autoGen 是否自增长
//如果使用自增长 添加时想让id自动虽数据库变化应使用此Api db.saveBindingId(s); 不然id为bean 对象id
@Column(name = "id",isId = true,autoGen = true)
int id;
@Column(name="name")
String name; public Student(int id, String name) {
this.id = id;
this.name = name;
} public Student() {
}
} @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
x.view().inject(this); DbManager.DaoConfig config = new DbManager.DaoConfig();
config.setDbName("info.db");
config.setDbVersion(1);
//设置数据库的位置 不设置为默认数据库位置data/data/pagekage/database/XXX.DB
// config.setDbDir();
dataText = new ArrayList<>(); db = x.getDb(config);
for (int i = 20; i < 40; i++) {
Student s= new Student(i,"asd"+i); try {
db.saveBindingId(s);
} catch (DbException e) {
e.printStackTrace();
}
} adapter = new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line,dataText);
lv.setAdapter(adapter);
} @Event({R.id.cx,R.id.del, R.id.update})
private void test(View v) throws DbException {
switch (v.getId()) {
case R.id.cx:
List<Student> all = db.findAll(Student.class);
dataText.clear();
for (int i = 0; i < all.size(); i++) {
dataText.add(all.get(i).name);
}
adapter.notifyDataSetChanged();
break;
case R.id.del:
WhereBuilder builder = WhereBuilder.b("name","=","asd20");
int delete = db.delete(Student.class, builder);
Toast.makeText(this, ""+delete, Toast.LENGTH_SHORT).show();
break;
case R.id.update:
db.saveOrUpdate(new Student(13,"ヾ(ToT)Bye~Bye~一"));
break;
default:
}
}
}

  • http模块
package qianfeng.com.day36_xutils;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.ImageView; import org.xutils.common.Callback;
import org.xutils.http.HttpMethod;
import org.xutils.http.RequestParams;
import org.xutils.view.annotation.Event;
import org.xutils.view.annotation.ViewInject;
import org.xutils.x; import java.io.File; public class HttpActivity extends AppCompatActivity {
@ViewInject(R.id.http_show_iv)
private ImageView http_show_iv; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_http);
x.view().inject(this);
} @Event({R.id.http_get_bt, R.id.http_post_bt, R.id.http_request_bt, R.id.http_down_bt})
private void onClick(View view) {
switch (view.getId()) {
case R.id.http_get_bt:
// 通过 get方式获取数据
getNetData();
break;
case R.id.http_post_bt:
// post方式
postNetData();
break;
case R.id.http_request_bt:
// 请求
requestNetData();
break;
case R.id.http_down_bt:
//下载
downNetData(); break;
} } // 下载
private void downNetData() {
// 获取文件下载的 地址
final String file_path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "pic.jpg";
RequestParams params = new RequestParams("http://tupian.enterdesk.com/2013/mxy/10/14/1/7.jpg");
// 设置 文件下载后的保存路径
params.setSaveFilePath(file_path);
// 文件下载设置的进度监听器
x.http().get(params, new Callback.ProgressCallback<File>() {
@Override
public void onWaiting() { } @Override
public void onStarted() { } @Override
public void onLoading(long total, long current, boolean isDownloading) {
// 文件下载的进度
int l = (int) (current * 100 / total);
Log.d("Mr.Zhao", "onLoading: " + l);
} @Override
public void onSuccess(File result) {
// 文件下载成功后的结果
Bitmap bitmap = BitmapFactory.decodeFile(file_path);
if (bitmap != null)
http_show_iv.setImageBitmap(bitmap); } @Override
public void onError(Throwable ex, boolean isOnCallback) { } @Override
public void onCancelled(CancelledException cex) { } @Override
public void onFinished() { }
});
} private void requestNetData() {
// 直接请求 网络数据 配置请求方法 HttpMehod GET POST 常量
x.http().request(HttpMethod.GET, new RequestParams("http://218.244.149.129:9010/api/industry.php"), new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) { } @Override
public void onError(Throwable ex, boolean isOnCallback) { } @Override
public void onCancelled(CancelledException cex) { } @Override
public void onFinished() { }
});
} // 以post方式请求
private void postNetData() {
RequestParams params = new RequestParams("http://218.244.149.129:9010/api/companylist.php");
params.addBodyParameter("industryid", "100");
x.http().post(params, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
Log.d("Mr.Zhao", "onSuccess: " + result);
} @Override
public void onError(Throwable ex, boolean isOnCallback) { } @Override
public void onCancelled(CancelledException cex) { } @Override
public void onFinished() { }
}); } // 以get方式 请求网络数据
private void getNetData() {
String path = "http://218.244.149.129:9010/api/industry.php";
RequestParams params = new RequestParams(path);
Callback.Cancelable cancelable = x.http().get(params, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
// 获取成功的时候执行该方法 并返回数据
Log.d("Mr.Zhao", "onSuccess: " + result);
} @Override
public void onError(Throwable ex, boolean isOnCallback) {
// 抛出异常的时候执行该方法
Log.d("Mr.Zhao", "onError: ");
} @Override
public void onCancelled(CancelledException cex) {
// 当 调用了 取消方法的时候 执行该方法
Log.d("Mr.Zhao", "onCancelled: ");
} @Override
public void onFinished() {
// 执行结束的时候执行该方法
// 包含成功后
Log.d("Mr.Zhao", "onFinished: ");
}
});
// 通过get方法 返回值 进行 取消访问网络的 操作
// cancelable.cancel(); } }

Picasso

初始化 当然也可以不用 我们在application中

package qianfeng.com.picassodemo.app;

import android.app.Application;
import android.graphics.Bitmap; import com.squareup.picasso.LruCache;
import com.squareup.picasso.Picasso; /**
* Created by ${Mr.Zhao} on 2016/10/17.
*/
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
initPicasso();
} private void initPicasso() {
int maxSize = (int) (Runtime.getRuntime().maxMemory() / 8);
Picasso picasso = new Picasso.Builder(this)
.memoryCache(new LruCache(maxSize))//设置内存缓存
/*默认false
true 会在 ImageView 的 左上角 添加一个 三角形的 符号
红色 网络 第一次下载
绿色 内存 销毁Activity再次进入
蓝色 SD 清空了任务列表
*/
.indicatorsEnabled(true)
// .downloader() 修改下载器
.defaultBitmapConfig(Bitmap.Config.RGB_565)
.build(); // 设置当前的 Picasso对象为 单例模式
Picasso.setSingletonInstance(picasso);
}
}
package qianfeng.com.picassodemo;

import android.graphics.Bitmap;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView; import com.squareup.picasso.Picasso; public class MainActivity extends AppCompatActivity { private String path = "http://img5.duitang.com/uploads/item/201510/01/20151001014728_tmHdG.jpeg";
private ImageView show_iv; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
show_iv = (ImageView) findViewById(R.id.show_iv);
Picasso.with(this).load(path)
.config(Bitmap.Config.RGB_565)
// .resize(50, 50) // 重新定义大小
// .centerCrop()//执行裁剪
.error(R.mipmap.ic_launcher)// 错误的时候 显示的图片 请求网络 三次 失败
.placeholder(R.mipmap.ic_launcher)// 默认图片
.into(show_iv); }
}

安卓高级1 -----Xutil3 和Picasso使用的更多相关文章

  1. 安卓高级 WebView的使用到 js交互

    我们先来学习 怎么使用再到用js和安卓源生方法交互 WebView简单使用 此部分转载并做了补充 原博客 原因:比较简单不是很想在写,我只要写js交互部分 WebView可以使得网页轻松的内嵌到app ...

  2. 安卓高级 Android图片缓存之初识Glide

    前言: 前面总结学习了图片的使用以及Lru算法,今天来学习一下比较优秀的图片缓存开源框架.技术本身就要不断的更迭,从最初的自己使用SoftReference实现自己的图片缓存,到后来做电商项目自己的实 ...

  3. 安卓高级9 用原生intent分享

    大家都用过安卓app时发现有个分享按钮如下: 所以今天特此分享用用原生完成: package qianfeng.com.simplesharedemo; import android.content. ...

  4. 安卓高级6 SnackBar

    引言 文/李牧羊(简书作者) 原文链接:http://www.jianshu.com/p/2654e6bda3b1 著作权归作者所有,转载请联系作者获得授权,并标注"简书作者". ...

  5. 【安卓高级】ViewPager视差动画效果

    在安卓开发中,是否遇见过一些很酷的视差动画效果,当ViewPager滑动下一页的时候,页面内的各种元素也能跟随滑动做位移效果,整体看起来非常有活力. 关键的PageTransformer PageTr ...

  6. 安卓高级Fresco图片框架的时候

    Fresco:2015FaceBook推出的 及其强大 支持webp图片格式 和渐进式图片加载 中文文档 使用方法 引入依赖 点击查看具体教程 基本使用步骤 在布局中使用其标签 <com.fac ...

  7. 安卓高级3 Android应用Design Support Library完全使用实例

    原作者:http://www.open-open.com/lib/view/open1433385856119.html 1 背景 上周一年一度的Google IO全球开发者大会刚刚结束,Google ...

  8. 安卓高级EventBus使用详解

    我本来想写但是在网上看了下感觉写得不如此作者写得好:http://www.jianshu.com/p/da9e193e8b03 前言:EventBus出来已经有一段时间了,github上面也有很多开源 ...

  9. 安卓高级 特效动画ExplosionField和 SmoothTransition

    本教程所有图片为github上的所无法正常访问请科学上网 SmoothTransition 展示效果 github:源码地址 使用方法 你能通过一行代码使用上面所有的动画 @Override prot ...

随机推荐

  1. __dict__

    类有一个__dict__字典属性,保存了当前类的每一个成员,举例如下: >>> class A: def __init__(self,value): self.value=value ...

  2. C#调用Python,报错No module named os

    C#调用Python 环境:Windows 8.1,已经安装Python2.7(C:\Python27),配置了环境变量. 已经安装VS2013,VS2017 1.安装IronPython 下载地址h ...

  3. ps图层的基本使用

    图层的使用 图层的基本使用一:复制,选择多个,背景图上添加图片,同时移动多个图层 复制图层:图层里的内容位置会变化,而拷贝的图层,图层里的位置不变,跟原来的图层一样 选择多个图层:shift选中多个图 ...

  4. 从零开始搭建springboot+mybatis+thymeleaf增删改查示例

    环境说明: 开发工具:Eclipse Mars.2 Release(4.5.2) JDK:1.8 Maven:3.3.3 注:Eclipse需安装sts插件,安装方法请自行百度 1. 新建maven工 ...

  5. C# 传统四舍五入保留两位小数(网上流传好多错误的版本)

    关于C#里面的Math.Round,很多人都会用到,而且以为是四舍五入,其实不是这样的: C#里面的Math.Round是符合IEEE标准的“四舍五入”,其实是五舍六入. 网上好多流传的下面这种方式实 ...

  6. CentOS搭建Apache+php+MySQL+Redis环境

    要搭建一个本地linux服务器环境,按照网络教程依葫芦画瓢,噼里啪啦搭好后,发现redis服务怎么也弄不好,不喜欢那种明知有问题却无从下手又无能为力的感觉,碰了无数次壁以后,我决定卸载,重头来过,并尽 ...

  7. [Codeforces 946D]Timetable

    Description 题库链接 给你一个 \(N\times M\) 的 \(01\) 矩阵,你可以从中将一些 \(1\) 变为 \(0\) ,最多 \(K\) 次.使操作之后使得每行最远的 \(1 ...

  8. [ZJOI2016]小星星

    题目描述 小Y是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有n颗小星星,用m条彩色的细线串了起来,每条细线连着两颗小星星. 有一天她发现,她的饰品被破坏了,很多细线都被拆掉了.这个饰品只剩下了 ...

  9. VK Cup 2017 - Квалификация 1

    CF上的VK Cup 2017资格赛1,好像很水,因为只有俄文所以语言是最大的障碍--不过之后正式赛貌似就有英文了.(比赛貌似只有开俄文模式才看的到--) 时长1天,不随时间扣分.FallDream ...

  10. Linux系统之TroubleShooting(故障排除)(转)

    尽管Linux系统非常强大,稳定,但是我们在使用过程当中,如果人为操作不当,仍然会影响系统,甚至可能使得系统无法开机,无法运行服务等等各种问题.那么这篇博文就总结一下一些常见的故障排除方法,但是不可能 ...