xUtils的网络请求

本文详细介绍了如何使用XUtils进行网络请求和数据库操作。首先,讲解了XUtils的准备工作,包括导入jar包、配置权限和初始化。接着,展示了如何发起HTTP请求,并通过Gson解析JSON数据。然后,通过例子演示了数据库的增删改查操作。最后,提到了文件下载和数据持久化的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

准备步骤:

使用步骤:

1.导入XUtils的jar包(直接搜索依赖)

  1. compile 'org.xutils:xutils:3.3.38'  
  1. import org.xutils.x;    //注意不要被自动导入其他包  

2.在AndroidManifest配置权限

  1. <uses-permission android:name="android.permission.INTERNET" />  
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  

3.初始化(第三方SDK都需要初始化

在MyApplication里操作(//在Activity获取Application的上下文用getApplication())
  1. @Override  
  2. public void onCreate() {  
  3.     super.onCreate();  
  4.     x.Ext.init(this);  
  5.     //x.Ext.setDebug(BuildConfig.DEBUG); // 是否输出debug日志, 开启debug会影响性能.  
  6.     ...  
  7. }  
4.使用:

访问网站:

  1. RequestParams params = new RequestParams("http://route.showapi.com/341-3");  
  2. params.addBodyParameter("showapi_appid""27210");  
  3. params.addBodyParameter("showapi_sign""9ee801974d5e4f119e69ceb780ac38af");  
  4. x.http().get(params, new Callback.CommonCallback<String>() {  
  5.     public void onSuccess(String result) {...}  //请求成功  
  6.     public void onError(Throwable ex, boolean isOnCallback) {...}   //客户端出错,没有连接上网络,或者请求完毕报错  
  7.     public void onCancelled(CancelledException cex) {...}   //用户取消  
  8.     public void onFinished() {...}  //请求结束 必备。在此关闭dialog  
  9. });  
若果服务器需要json数据(接口文档中application/json)
  1. params.setAsJsonContent(true);  
  2. params.setBodyContent("json数据");  
再创建用GsonFormat粘贴json数据的类
导入Gson的jar包


例子:

所需数据:

a. 调用接口 showapi《笑话大全》

b. json数据 http://route.showapi.com/341-2?showapi_appid=27210&showapi_sign=9ee801974d5e4f119e69ceb780ac38af

c. 

  1. {  
  2.     "showapi_res_body": {  
  3.         "allNum": 34961,  
  4.         "allPages": 1749,  
  5.         "contentlist": [  
  6.             {  
  7.                 "ct": "2016-12-10 14:31:22.925",  
  8.                 "id": "584ba13a6e368ed797a68445",  
  9.                 "img": "http://www.zbjuran.com/uploads/allimg/161210/10-1612101402522T.jpg",  
  10.                 "title": "听说最近两个单身汪弄了个新组合叫:彭胡弯。",  
  11.                 "type": 2  
  12.             },  
  13.                 .  
  14.                 .  
  15.                 .                 
  16.             {  
  17.                 "ct": "2016-12-10 10:31:14.192",  
  18.                 "id": "584b68f26e368ed797a565e2",  
  19.                 "img": "http://www.zbjuran.com/uploads/allimg/161210/10-161210101606243.jpg",  
  20.                 "title": "程序员的愤怒",  
  21.                 "type": 2  
  22.             }  
  23.         ],  
  24.         "currentPage": 1,  
  25.         "maxResult": 20,  
  26.         "ret_code": 0  
  27.     },  
  28.     "showapi_res_code": 0,  
  29.     "showapi_res_error": ""  
  30. }  


步骤:

1.导入jar包xutils、gson
2.在AndroidManifest配置权限
  1. <uses-permission android:name="android.permission.INTERNET" />  
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
3.MyApplication.java类,在其中完成初始化
  1. //在Activity获取Application的上下文用getApplication()  
  2. public class MyApplication extends Application{  
  3.     @Override  
  4.     public void onCreate() {  
  5.         super.onCreate();  
  6.         x.Ext.init(this);  
  7.     }  
  8. }  
4.JsonBean.java (Alt+S插入json数据见上c)
  1. public class JsonBean {  
  2.   
  3.     private int showapi_res_code;  
  4.     private String showapi_res_error;  
  5.     private ShowapiResBodyBean showapi_res_body;  
  6.   
  7.     public int getShowapi_res_code() {  
  8.         return showapi_res_code;  
  9.     }  
  10.   
  11.     public void setShowapi_res_code(int showapi_res_code) {  
  12.         this.showapi_res_code = showapi_res_code;  
  13.     }  
  14.   
  15.     public String getShowapi_res_error() {  
  16.         return showapi_res_error;  
  17.     }  
  18.   
  19.     public void setShowapi_res_error(String showapi_res_error) {  
  20.         this.showapi_res_error = showapi_res_error;  
  21.     }  
  22.   
  23.     public ShowapiResBodyBean getShowapi_res_body() {  
  24.         return showapi_res_body;  
  25.     }  
  26.   
  27.     public void setShowapi_res_body(ShowapiResBodyBean showapi_res_body) {  
  28.         this.showapi_res_body = showapi_res_body;  
  29.     }  
  30.   
  31.     public static class ShowapiResBodyBean {  
  32.   
  33.         private int allPages;  
  34.         private int ret_code;  
  35.         private int currentPage;  
  36.         private int allNum;  
  37.         private int maxResult;  
  38.         private List<ContentlistBean> contentlist;  
  39.   
  40.         public int getAllPages() {  
  41.             return allPages;  
  42.         }  
  43.   
  44.         public void setAllPages(int allPages) {  
  45.             this.allPages = allPages;  
  46.         }  
  47.   
  48.         public int getRet_code() {  
  49.             return ret_code;  
  50.         }  
  51.   
  52.         public void setRet_code(int ret_code) {  
  53.             this.ret_code = ret_code;  
  54.         }  
  55.   
  56.         public int getCurrentPage() {  
  57.             return currentPage;  
  58.         }  
  59.   
  60.         public void setCurrentPage(int currentPage) {  
  61.             this.currentPage = currentPage;  
  62.         }  
  63.   
  64.         public int getAllNum() {  
  65.             return allNum;  
  66.         }  
  67.   
  68.         public void setAllNum(int allNum) {  
  69.             this.allNum = allNum;  
  70.         }  
  71.   
  72.         public int getMaxResult() {  
  73.             return maxResult;  
  74.         }  
  75.   
  76.         public void setMaxResult(int maxResult) {  
  77.             this.maxResult = maxResult;  
  78.         }  
  79.   
  80.         public List<ContentlistBean> getContentlist() {  
  81.             return contentlist;  
  82.         }  
  83.   
  84.         public void setContentlist(List<ContentlistBean> contentlist) {  
  85.             this.contentlist = contentlist;  
  86.         }  
  87.   
  88.         public static class ContentlistBean {  
  89.   
  90.             private String id;  
  91.             private String title;  
  92.             private String img;  
  93.             private int type;  
  94.             private String ct;  
  95.   
  96.             public String getId() {  
  97.                 return id;  
  98.             }  
  99.   
  100.             public void setId(String id) {  
  101.                 this.id = id;  
  102.             }  
  103.   
  104.             public String getTitle() {  
  105.                 return title;  
  106.             }  
  107.   
  108.             public void setTitle(String title) {  
  109.                 this.title = title;  
  110.             }  
  111.   
  112.             public String getImg() {  
  113.                 return img;  
  114.             }  
  115.   
  116.             public void setImg(String img) {  
  117.                 this.img = img;  
  118.             }  
  119.   
  120.             public int getType() {  
  121.                 return type;  
  122.             }  
  123.   
  124.             public void setType(int type) {  
  125.                 this.type = type;  
  126.             }  
  127.   
  128.             public String getCt() {  
  129.                 return ct;  
  130.             }  
  131.   
  132.             public void setCt(String ct) {  
  133.                 this.ct = ct;  
  134.             }  
  135.   
  136.         }  
  137.     }  
  138. }  


5. MainActivity.java
  1. /** 
  2.  * xUtils: http、view、db、image(三级缓存,没有压缩,有裁剪) 
  3.  * Gson、FastJson 解析Json 
  4.  * volley ——ImageLoad有三级缓存  ——NetWorkImageView 
  5.  * okHttp 
  6.  * rejava retrofit dagger2 
  7.  * Glide (压缩,裁剪,没有三级缓存) 
  8.  */  
  9. // get/post由服务器决定,在接口文档上需要都有说明  
  10. //    get文件下载,post文件上传;get是拼接的,post是表单  
  11. public class MainActivity extends AppCompatActivity implements View.OnClickListener {  
  12.     Button button;  
  13.     Button btnNext;  
  14.     ImageView iv;  
  15.     TextView tvNum;  
  16.     TextView tvTime;  
  17.     int i = 0;  
  18.     List<JsonBean.ShowapiResBodyBean.ContentlistBean> list;  
  19.     JsonBean.ShowapiResBodyBean.ContentlistBean contentlistBean;  
  20.   
  21.     @Override  
  22.     protected void onCreate(Bundle savedInstanceState) {  
  23.         super.onCreate(savedInstanceState);  
  24.         setContentView(R.layout.activity_main);  
  25.         button = (Button) findViewById(R.id.btn);  
  26.         btnNext = (Button) findViewById(R.id.btnNext);  
  27.         iv = (ImageView) findViewById(R.id.iv);  
  28.         tvNum = (TextView) findViewById(R.id.tvNum);  
  29.         tvTime = (TextView) findViewById(R.id.tvTime);  
  30.         button.setOnClickListener(this);  
  31.         btnNext.setOnClickListener(this);  
  32.         btnNext.setVisibility(View.INVISIBLE);  
  33.     }  
  34.   
  35.     @Override  
  36.     public void onClick(View view) {  
  37.         switch (view.getId()) {  
  38.             case R.id.btn:  
  39.                 // 笑话大全  http://route.showapi.com/341-2?showapi_appid=27210&showapi_sign=9ee801974d5e4f119e69ceb780ac38af  
  40.                 RequestParams params = new RequestParams("http://route.showapi.com/341-2");  
  41.                 params.addBodyParameter("showapi_appid""27210");  
  42.                 params.addBodyParameter("showapi_sign""9ee801974d5e4f119e69ceb780ac38af");  
  43.                 x.http().get(params, new Callback.CommonCallback<String>() {    //String JSONObject JSONArray File(下载文件) byte[]  
  44.                     @Override  
  45.                     public void onSuccess(String result) {  //请求成功  
  46.                         Log.e("======", result);  
  47.                         Gson gson = new Gson();    //创建Gson对象  
  48.                         JsonBean jsonBean = gson.fromJson(result, JsonBean.class);    //得到JsonBean对象  
  49.                         list = jsonBean.getShowapi_res_body().getContentlist();  
  50.                         contentlistBean = list.get(0);  
  51.                         String initImage = contentlistBean.getImg();  
  52.                         x.image().bind(iv, initImage);<span style="white-space:pre">        </span>//此处XUtils的图片绑定操作  
  53.                         tvNum.setText(1 + "");  
  54.                         tvTime.setText(contentlistBean.getCt());  
  55.                         btnNext.setVisibility(View.VISIBLE);    //请求成功的话将BtnNext  
  56.                         button.setVisibility(View.INVISIBLE);  
  57.                     }  
  58.   
  59.                     @Override  
  60.                     public void onError(Throwable ex, boolean isOnCallback) { //客户端出错,没有连接上网络,或者请求完毕报错  
  61.                         Toast.makeText(MainActivity.this"请求出错了", Toast.LENGTH_SHORT).show();  
  62.                     }  
  63.   
  64.                     @Override  
  65.                     public void onCancelled(CancelledException cex) {<span style="font-family: Arial, Helvetica, sans-serif;">    //用户取消</span>  
  66.                     }  
  67.   
  68.                     @Override  
  69.                     public void onFinished() { //请求结束 必备。在此关闭dialog  
  70.                     }  
  71.                 });  
  72.                 break;  
  73.             case R.id.btnNext:  
  74.                 if (i < 19) {  
  75.                     i++;  
  76.                 } else {  
  77.                     i = 0;  
  78.                 }  
  79.                 contentlistBean = list.get(i);  
  80.                 String image = contentlistBean.getImg();  
  81.                 x.image().bind(iv, image);  
  82.                 tvNum.setText(i + 1 + "");  
  83.                 tvTime.setText(contentlistBean.getCt());  
  84.         }  
  85.     }  
  86. }  

6.布局
  1. <FrameLayout  
  2.     android:layout_width="wrap_content"  
  3.     android:layout_height="wrap_content">  
  4.   
  5.     <Button  
  6.         android:id="@+id/btn"  
  7.         android:layout_width="match_parent"  
  8.         android:layout_height="wrap_content"  
  9.         android:text="用xUtils访问网络" />  
  10.   
  11.     <Button  
  12.         android:id="@+id/btnNext"  
  13.         android:layout_width="match_parent"  
  14.         android:layout_height="wrap_content"  
  15.         android:text="下一张" />  
  16. </FrameLayout>  
  17.   
  18. <TextView  
  19.     android:id="@+id/tvNum"  
  20.     android:layout_width="wrap_content"  
  21.     android:layout_height="wrap_content" />  
  22.   
  23. <TextView  
  24.     android:id="@+id/tvTime"  
  25.     android:layout_width="wrap_content"  
  26.     android:layout_height="wrap_content" />  
  27.   
  28. <ImageView  
  29.     android:id="@+id/iv"  
  30.     android:layout_width="wrap_content"  
  31.     android:layout_height="wrap_content" />  





效果:



下载文件

  1. case R.id.btn_download:  
  2.     RequestParams params2 = new RequestParams("https://www.duetdisplay.com/DuetSetup.exe");  
  3.     params2.setCacheDirName("qqq");  
  4.     x.http().get(params2, new Callback.ProgressCallback<File>() {    //下载用get,上传用post  
  5.         @Override  
  6.         public void onWaiting() {  
  7.         }  
  8.   
  9.         @Override  
  10.         public void onStarted() {  
  11.         }  
  12.   
  13.         @Override  
  14.         public void onLoading(long total, long current, boolean isDownloading) {  
  15.             Log.e("==============", current + "-------" + total);  
  16.         }  
  17.   
  18.         @Override  
  19.         public void onSuccess(File result) {  
  20.             Log.e("==============""下载成功");  
  21.             Log.e("文件储存路径:", result.getAbsolutePath());// /storage/emulated/0/Android/data/com.example.xutils/cache/qqq/1f7dd403daceb07d0f9c46f4258deda5  
  22.         }  
  23.   
  24.         @Override  
  25.         public void onError(Throwable ex, boolean isOnCallback) {  
  26.         }  
  27.   
  28.         @Override  
  29.         public void onCancelled(CancelledException cex) {  
  30.         }  
  31.   
  32.         @Override  
  33.         public void onFinished() {  
  34.             Log.e("==============""下载结束");  
  35.         }  
  36.     });  
  37.     break;  


数据库操作

1. 在MyApplication里面配置数据库属性(这样使得全局只有并共用同一个数据库(可以有多个数据库,但是一般只有一个))

  1. public class MyApplication extends Application {  
  2.     private static MyApplication instance;  
  3.   
  4.     public static MyApplication getInstance() {  
  5.         return instance;  
  6.     }  
  7.   
  8.     @Override  
  9.     public void onCreate() {  
  10.         super.onCreate();  
  11.         x.Ext.init(this);  
  12.         instance = this;  
  13.     }  
  14.   
  15.     //可以有多个数据库,但是最好只有一个,配置在MyApplication使得变为全局,只有这一个数据库  
  16.     DbManager getDbManager() {  //通过DbManager来设置数据库  
  17.         DbManager.DaoConfig daoConfig = new DbManager.DaoConfig();  
  18.         daoConfig.setDbName("user.db");  
  19.         //daoConfig.setDbDir(""); //设置数据库的存储路径,默认在data/data/包/databases/数据库名称  
  20.         //daoConfig.setDbVersion(1); //数据库版本,默认是1  
  21.         return x.getDb(daoConfig);  
  22.     }  
  23. }  

2. 数据Bean

  1. //需要注解,才能操作数据库  
  2. //如果使用数据库,必须要有空参的构造方法 get和set  
  3.   
  4. @Table(name = "User")  
  5. public class UserBean {  
  6.       
  7.     @Column(name = "name")  
  8.     private String name;  
  9.     @Column(name = "ids", isId = true, autoGen = true//id为主键,根据id判断是否为同一个对象  
  10.     private int ids;  
  11.     @Column(name = "age")  
  12.     private int age;  
  13.     @Column(name = "sex")  
  14.     private String sex;  
  15.   
  16.     public String getName() {  
  17.         return name;  
  18.     }  
  19.   
  20.     public void setName(String name) {  
  21.         this.name = name;  
  22.     }  
  23.   
  24.     public int getIds() {  
  25.         return ids;  
  26.     }  
  27.   
  28.     public void setIds(int ids) {  
  29.         this.ids = ids;  
  30.     }  
  31.   
  32.     public int getAge() {  
  33.         return age;  
  34.     }  
  35.   
  36.     public void setAge(int age) {  
  37.         this.age = age;  
  38.     }  
  39.   
  40.     public String getSex() {  
  41.         return sex;  
  42.     }  
  43.   
  44.     public void setSex(String sex) {  
  45.         this.sex = sex;  
  46.     }  
  47. }  

3. 增删改查

1.创建DbManager对象,通过该对象执行增删改查
2.获取数据Bean对象
3.添加数据需要给该对象设置值
添加:
  1. dbManager.save(userBean);  
删除:
  1. //dbManager1.delete(UserBean.class);    //删除全部数据库  
  2. //dbManager1.deleteById(UserBean.class, 6);    //删除指定id的项  //此时后一个不会自动把ids变为6,即ids为6的项消失 //删除了6再添加6也是按顺序添加,6在自动增长的情况下永远空缺   
  3. dbManager1.delete(UserBean.class, WhereBuilder.b("sex""=""女").and("age""<""19"));  
修改:
  1. dbManager2.update(UserBean.class, WhereBuilder.b("age""<""19"), keyValue, keyValue2);  
查询:
  1. List<UserBean> list = dbManager3.findAll(UserBean.class); //查询所有 (常用)  
  2. //dbManager3.findById(UserBean.class, 1);  //查询id为1的数据  
  3. //List<UserBean> list = dbManager3.selector(UserBean.class).where("sex", "=", "女").and("age", "<", "19").findAll(); //按要求查询  

每一个操作之后需要关闭数据库
  1. dbManager.close();  

  1. public class MainActivity extends AppCompatActivity {  
  2.   
  3.     @BindView(R.id.btn_save)  
  4.     Button btnAdd;  
  5.     @BindView(R.id.btn_delete)  
  6.     Button btnDelete;  
  7.     @BindView(R.id.btn_query)  
  8.     Button btnQuery;  
  9.     @BindView(R.id.btn_update)  
  10.     Button btnUpdate;  
  11.   
  12.     @Override  
  13.     protected void onCreate(Bundle savedInstanceState) {  
  14.         super.onCreate(savedInstanceState);  
  15.         setContentView(R.layout.activity_main);  
  16.         ButterKnife.bind(this);  
  17.     }  
  18.   
  19.     @OnClick({R.id.btn_save, R.id.btn_delete, R.id.btn_query, R.id.btn_update})  
  20.     public void onClick(View view) {  
  21.         switch (view.getId()) {  
  22.             case R.id.btn_save:  
  23.                 DbManager dbManager = MyApplication.getInstance().getDbManager();  
  24.                 UserBean userBean = new UserBean();  
  25.                 userBean.setAge(10);  
  26.                 userBean.setIds(6);  //如果自动增长,那么会持续创建数据项,否则只会有一条ids为1的项  
  27.                 userBean.setName("张三");  
  28.                 userBean.setSex("女");  
  29.   
  30.                 //--存储项到数据库,不会自动更新 (常用)  
  31.                 try {  
  32.                     dbManager.save(userBean);   //如果不设置自动增长,那么储存失败,因为该ids的项已经存在  
  33.                 } catch (DbException e) {  
  34.                     e.printStackTrace();  
  35.                     Log.e("错误1""储存失败");  
  36.                 }  
  37.   
  38.   
  39.                 ///--存储数据到数据库,如果已经存在则更新数据  
  40.                 /* ----主键不自动增长的情况下 
  41.                 try { 
  42.                     dbManager.save(userBean); 
  43.                 } catch (DbException e) {   //如果已经存在 
  44.                     e.printStackTrace(); 
  45.                     try {   //如果已经存在则存储或修改(主键必须不设置为自动增长) 
  46.                         dbManager.saveOrUpdate(userBean); 
  47.                     } catch (DbException e1) { 
  48.                         e1.printStackTrace(); 
  49.                     } 
  50.                 } 
  51.                 */  
  52.   
  53.                 /* ----主键自动增长的情况下 
  54.                 try { 
  55.                     UserBean userBean1 = dbManager.findById(UserBean.class, userBean.getIds());  //在数据库中根据ids找到对象 
  56.                     if (userBean1 == null) {    //如果数据库中没有该对象,则保存该对象,ids自动增长,不受修改的ids的值的影响 
  57.                         dbManager.save(userBean); 
  58.                     } else {    //如果数据库中有该对象,则更新该对象 
  59.                         dbManager.saveOrUpdate(userBean);   //暂时发现与.update()效果一样 
  60.                     } 
  61.                 } catch (DbException e) { 
  62.                     e.printStackTrace(); 
  63.                 } 
  64.                 try { 
  65.                     dbManager.close();  //数据库需要关闭 
  66.                 } catch (IOException e) { 
  67.                     e.printStackTrace(); 
  68.                 } 
  69.                 */  
  70.                 break;  
  71.   
  72.             case R.id.btn_delete:   //一般不操作删除  
  73.                 DbManager dbManager1 = MyApplication.getInstance().getDbManager();  
  74.                 try {  
  75.                     //dbManager1.delete(UserBean.class);    //删除全部数据库  
  76.                     //dbManager1.deleteById(UserBean.class, 6);    //删除指定id的项  //此时后一个不会自动把ids变为6,即ids为6的项消失 //删除了6再添加6也是按顺序添加,6在自动增长的情况下永远空缺   
  77.                     dbManager1.delete(UserBean.class, WhereBuilder.b("sex""=""女").and("age""<""19"));  
  78.                 } catch (DbException e) {  
  79.                     e.printStackTrace();  
  80.                 }  
  81.                 try {  
  82.                     dbManager1.close();  
  83.                 } catch (IOException e) {  
  84.                     e.printStackTrace();  
  85.                 }  
  86.                 break;  
  87.             case R.id.btn_update:  
  88.                 DbManager dbManager2 = MyApplication.getInstance().getDbManager();  
  89.                 KeyValue keyValue = new KeyValue("age"80);  
  90.                 KeyValue keyValue2 = new KeyValue("name""赵六");  
  91.                 try {  
  92.                     dbManager2.update(UserBean.class, WhereBuilder.b("age""<""19"), keyValue, keyValue2);  
  93.                 } catch (DbException e) {  
  94.                     e.printStackTrace();  
  95.                 }  
  96.                 try {  
  97.                     dbManager2.close();  
  98.                 } catch (IOException e) {  
  99.                     e.printStackTrace();  
  100.                 }  
  101.                 break;  
  102.             case R.id.btn_query:  
  103.                 DbManager dbManager3 = MyApplication.getInstance().getDbManager();  
  104.                 try {  
  105.                     List<UserBean> list = dbManager3.findAll(UserBean.class); //查询所有 (常用)   
  106.                     // dbManager3.findById(UserBean.class, 1); //查询id为1的数据   
  107.                     // List<UserBean> list = dbManager3.selector(UserBean.class).where("sex", "=", "女").and("age", "<", "19").findAll(); //按要求查询   
  108.                 } catch (DbException e) {  
  109.                     e.printStackTrace();  
  110.                 }  
  111.                 try {  
  112.                     dbManager3.close();  
  113.                 } catch (IOException e) {  
  114.                     e.printStackTrace();  
  115.                 }  
  116.                 break;  
  117.         }  
  118.     }  
  119. }  
  1. <pre code_snippet_id="2114228" snippet_file_name="blog_20170110_22_2558018"></pre>  
  2. <pre></pre>  
  3. <pre></pre> 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值