显示用户未登录

显示用户未登录

已经在主线程中进行post:

下面是所有的url地址的常量:

public static final String NETPATH = "http://restaurant.t.imooc.io/basePro/";
public static final String NETPATH_REGISTER = "user_register";
public static final String NETPATH_LOGIN = "user_login";
public static final String NETPATH_PRODUCT = "product_find";
public static final String NETPATH_ORDER = "order_find";


在登陆界面中的请求:

OkHttpUtils.post().url(FinalNumber.NETPATH + FinalNumber.NETPATH_LOGIN).addParams("username", current_user.getUsername())
       .addParams("password", current_user.getPassword()).build().execute(new Callback() {
   @Override
   public Object parseNetworkResponse(Response response, int i) throws Exception {
       data = response.body().string();
       JSONObject jsonObject = new JSONObject(data);
       resultCode = jsonObject.getInt("resultCode");
       dataIsOk(resultCode);
       Log.i("login: ",data);
       return null;
   }

   @Override
   public void onError(Call call, Exception e, int i) {
       dataIsOk(resultCode);
   }

   @Override
   public void onResponse(Object o, int i) {

   }
});

private void dataIsOk(int resultcode) {
   switch (resultcode) {
       case -1:
           Looper.prepare();
           Toast.makeText(mContext, "网络故障", Toast.LENGTH_SHORT).show();
           Looper.loop();
           break;
       case 0:
           Looper.prepare();
           Toast.makeText(mContext, data, Toast.LENGTH_SHORT).show();
           Looper.loop();
           break;
       case 1:
           try {
               JSONObject userdataString = new JSONObject(data);
               JSONObject user_login = userdataString .getJSONObject("data");
               current_user = new User(user_login.getString("username"), user_login.getString("password"));
               current_user.setId(user_login.getInt("id"));
               SharedPreferences sharedPreferences = mContext.getSharedPreferences("userInfo", Context.MODE_PRIVATE);
               SharedPreferences.Editor edit = sharedPreferences.edit();
               Log.i("getuserdata: ", current_user.toString());
               edit.putString("lastusername", current_user.getUsername());
               edit.putString("lastpassword", current_user.getPassword());
               edit.commit();
               ((Login_Activity) mContext).to_MainActivity();
               return;
           } catch (JSONException e) {
               Looper.prepare();
               Toast.makeText(mContext, data, Toast.LENGTH_SHORT).show();
               Looper.loop();
               e.printStackTrace();
           }

           }

   }


下面是在主页面中请求订单数据:


private void getDataFromNet() {
   //加载网络数据并解析
   //TODO
   SharedPreferences preferences = getSharedPreferences("userInfo", Context.MODE_PRIVATE);
   String username = preferences.getString("lastusername", "1");
   String password = preferences.getString("lastpassword", "1");
   //new GetDataAsync().execute(FinalNumber.NETPATH + FinalNumber.NETPATH_ORDER);
   //setListData();
   OkHttpUtils.post().url(FinalNumber.NETPATH+FinalNumber.NETPATH_ORDER).addParams("currentPage", "0")
           .build().execute(new StringCallback() {
       @Override
       public void onError(Call call, Exception e, int i) {

       }

       @Override
       public void onResponse(String s, int i) {
           Log.i( "ceshi: ",s);
       }
   });
}


log打印的内容:I/ceshi:: {"resultCode":-100,"resultMessage":"用户未登录"}

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

3回答
irista23 2017-12-22 15:23:04

你把代码整理一下,向服务器提交登录数据,在回调onSuccess()方法中直接可以取到用户信息,本地保存,跳转订单界面

http://img1.sycdn.imooc.com//climg/5a3cb22d00016ade07450317.jpg

在订单界面,需要传入CommonCallback<List<Order>>类型参数

http://img1.sycdn.imooc.com//climg/5a3cb2990001608d06400502.jpg

保证RequestCall中构建的request参数值没有问题,就应该可以了。

irista23 2017-12-21 15:13:45

OkHttp本身就是网络加载框架,他的回调方法就是在UI线程里了,不需要你在用AsyncTask中的doInBackgroud再去处理了。返回无登录数据,你查看一下url地址是否正确:

http://img1.sycdn.imooc.com//climg/5a3b5f1d000105eb11420240.jpg

  • 提问者 selfnight #1
    地址确定是没错的,会不会是因为我在请求订单数据时直接给了个值为0的currentpage的问题?又或者是我创建了不同的requestcall对象导致的呢?
    2017-12-21 15:21:22
  • irista23 回复 提问者 selfnight #2
    callback已经在UI线程了,你现在是放在子线程去操作了,建议你把去掉AsyncTask相关操作只使用OkHttpUtils
    2017-12-21 16:33:00
  • 提问者 selfnight 回复 irista23 #3
    提取出来了,还是显示用户未登录
    2017-12-21 16:35:49
irista23 2017-12-21 10:45:07

1、这里要注意,像用户名密码这种保密性比较高的,要选择post方式向服务器提交数据,post提交的数据不会像get那种把数据信息显示到url中。

2、登录成功后获取订单数据和登录的方式是一样的,只不过url为http://restaurant.t.imooc.io/basePro/order_find,参数为currentPage,值为0。再定义个计数变量,当用户选择类似下一页操作时,这个变量值++。

3、app中使用okhttp方式登录如果没有成功可以把代码贴出来,方便我们帮你查看问题。


  • 提问者 selfnight #1
    已补充问题,代码已贴
    2017-12-21 11:49:21
  • irista23 回复 提问者 selfnight #2
    你把地址NETPATH_ORDER改成NETPATH_PRODUCT
    2017-12-21 17:02:58
  • 提问者 selfnight 回复 irista23 #3
    可以读出来,但这个不是请求所有产品的时候用的么?
    2017-12-21 17:06:12
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星

相似问题

登录后可查看更多问答,登录/注册

Android从界面到数据存储2018版
  • 参与学习       504    人
  • 提交作业       1003    份
  • 解答问题       1044    个

本专题是专为有Java语言基础想入坑Android开发的同学们准备的。从AndroidUI基础一直到网络,数据存储,一步到位入门Android开发。如果你会Java,那就不要犹豫了~ ~

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师