BUG描述:
明明引入了import com.alibaba.fastjson.JSON;但as显示该引用未被使用。
JSONObject jsonObject= JSON.parseObject(data);的时候,as将parseObject标红,表示无法识别进行处理。
BUG出现原因:
由于在该活动内涉及okhttp进行网络通信,其中已经对JSON进行了定义,这与fastjson的JSON冲突,当涉及JSON的时候系统自动使用该定义导致无法引入fastjson的JSON包。
//okhttp已经定义了一个JSON对象
public static final MediaType JSON= MediaType.get("application/json; charset=utf-8");
。。。省略中间其他okhttp的内容
formBody = RequestBody.create(post,JSON);
解决办法:
//将okhttp用到的JSON改名为其他内容,解决冲突
public static final MediaType JSON1= MediaType.get("application/json; charset=utf-8");
。。。省略中间其他okhttp的内容
formBody = RequestBody.create(post,JSON1);
最后,放上我的MainActivity的代码,供初学okhttp+fastjson的同学们参考。由于我也是第一次使用,可能有的地方写的不够好,如有不足请指正。
package com.example.testhrms; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.widget.EditText; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONException; import com.alibaba.fastjson.JSONObject; import org.jetbrains.annotations.NotNull; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.ConnectException; import java.net.SocketTimeoutException; import java.util.concurrent.TimeUnit; import okhttp3.Call; import okhttp3.Callback; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; public class LoginActivity extends AppCompatActivity { public static final MediaType JSON1= MediaType.get("application/json; charset=utf-8"); EditText et_userid; EditText et_userpwd; String username; String password; private JSONObject jsonfile; private String data;//接收服务器返回的数据 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); //初始化资源控件 initView(); } //获取资源控件id private void initView() { et_userid=findViewById(R.id.et_userid); et_userpwd=findViewById(R.id.et_userpwd); } //点击登陆按钮后执行 public void doLogin(View view) throws UnsupportedEncodingException { //首先获取用户输入的账号和密码 username = et_userid.getText().toString().trim(); password = et_userpwd.getText().toString().trim(); Log.i("net_test", username+"/"+password); //判断用户输入的账号与密码是否为空 if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)){ Toast.makeText(this, "输入不能为空", Toast.LENGTH_SHORT).show(); return; } // else//两个输入都非空,准备执行okhttp { try { post_login(username,password); } catch (JSONException e) { e.printStackTrace(); } } } private void post_login(String username,String password) throws JSONException { //拼接要发送的json jsonfile=new JSONObject(); jsonfile.put("user_id",username); jsonfile.put("user_key",password); String post=jsonfile.toString(); //1,创建OKHttpClient对象 OkHttpClient okHttpClient=new OkHttpClient(); okHttpClient.newBuilder().connectTimeout(10, TimeUnit.SECONDS) .readTimeout(15, TimeUnit.SECONDS) .writeTimeout(150, TimeUnit.MILLISECONDS) .build(); RequestBody formBody; formBody = RequestBody.create(post,JSON1); //拼接url字符串 String s1=getString(R.string.server_url0); String s2="post_login.php";//post_login.php //String s3=getString(R.string.server_lasturl);//?Content-Type=application/json String url=s1+s2; Log.i("net_test", url); //2,创建一个Request Request request=new Request.Builder() .addHeader("Content-Type","application/json") .url(url) .post(formBody) .build(); Log.i("net_test","request创建成功"); //3,创建一个call对象 Call call = okHttpClient.newCall(request); //4,将请求添加到调度中 call.enqueue(new Callback() { @Override public void onFailure(@NotNull Call call, @NotNull IOException e) { Log.d("net_test", "onFailure: failure"); //用来看是否失败 Log.d("net_test", e.toString()); if(e instanceof SocketTimeoutException) { Log.d("net_test", "超时异常"); } else if(e instanceof ConnectException) { Log.d("net_test", "连接异常"); } } @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { Log.d("net_test", "onResponse:response "); //用来看是否有响应 //利用fastjson处理json数据并准备保存到全局变量中 data=response.body().string(); Log.d("net_test", "成功返回结果:"+data); //成功返回结果:{"user_id":"15588399220","department_id":"1","user_name":"柳一菲","user_rank":"1"} //JSONObject jsonObject=JSON.parseObject(data); runOnUiThread(new Runnable() { @Override public void run() { //mytext.setText(data); if(data.equals("false1")) { Log.i("net_test", "密码错误"); new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { Toast.makeText(LoginActivity.this, "密码错误!", Toast.LENGTH_SHORT).show(); } }); } else if(data.equals("false2")) { Log.i("net_test", "账号不存在"); new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { Toast.makeText(LoginActivity.this, "账号不存在,请先联系管理员注册!", Toast.LENGTH_SHORT).show(); } }); } else { Log.i("net_test", "登陆成功"); JSONObject jsonObject= JSON.parseObject(data); final String user_id=jsonObject.getString("user_id"); final String user_name=jsonObject.getString("user_name"); final String department_id=jsonObject.getString("department_id"); final String user_rank=jsonObject.getString("user_rank"); Log.i("net_test","json对象:" + user_id+"/"+user_name+"/"+department_id+"/"+user_rank); //处理传回的用户信息数据 myData.set_user_id(user_id); myData.set_department_id(department_id); myData.set_user_name(user_name); myData.set_user_rank(user_rank); Log.i("net_test","将账户信息相关的json存为全局变量成功!:" + myData.get_user_id()+"/"+myData.get_department_id()+"/"+myData.get_user_name()+"/"+myData.get_user_rank()); //如果需要存储的全局变量都被赋值成功则跳转主页面 if(!myData.get_user_id().equals("")&&!myData.get_user_name().equals("") &&!myData.get_user_rank().equals("")&&!myData.get_department_id().equals("")) { //Toast必须出现在主线程上。使用 new Handler(Looper.getMainLooper()) 来生成一个主线程 // handler 从任何后台回线程,然后使用它发布 toast 主线程的工作 new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { Toast.makeText(LoginActivity.this, "登陆成功!", Toast.LENGTH_SHORT).show(); //跳转到主页面 Intent intent = new Intent(LoginActivity.this, MainActivity.class); startActivity(intent); LoginActivity.this.finish(); } }); } } } }); } }); } //okhttp官网的post案例 // public static final MediaType JSON // = MediaType.get("application/json; charset=utf-8"); // // OkHttpClient client = new OkHttpClient(); // // String post(String url, String json) throws IOException { // RequestBody body = RequestBody.create(json, JSON); // Request request = new Request.Builder() // .url(url) // .post(body) // .build(); // try (Response response = client.newCall(request).execute()) { // return response.body().string(); // } // } //okhttp官网的get案例 // OkHttpClient client = new OkHttpClient(); // // String run(String url) throws IOException { // Request request = new Request.Builder() // .url(url) // .build(); // // try (Response response = client.newCall(request).execute()) { // return response.body().string(); // } // } }