报错:E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.searchphone, PID: 30446
java.lang.NoClassDefFoundError: Failed resolution of: Lkotlin/text/Charsets;
at okio.Buffer.<clinit>(Buffer.kt:2212)
at okhttp3.ResponseBody.create(ResponseBody.java:210)
at okhttp3.internal.Util.<clinit>(Util.java:60)
at okhttp3.internal.Util.immutableList(Util.java:234)
at okhttp3.OkHttpClient.<clinit>(OkHttpClient.java:123)
at com.example.searchphone.business.HttpUntil.<init>(HttpUntil.java:30)
at com.example.searchphone.mvp.Presenter.MainPresenter.sendHttp(MainPresenter.java:41)
at com.example.searchphone.mvp.Presenter.MainPresenter.searchPhoneinfo(MainPresenter.java:36)
at com.example.searchphone.MainActivity.onClick(MainActivity.java:44)
详细说明:报错显示错误主要在at com.example.searchphone.business.HttpUntil.<init>(HttpUntil.java:30)
at com.example.searchphone.mvp.Presenter.MainPresenter.sendHttp(MainPresenter.java:41)
at com.example.searchphone.mvp.Presenter.MainPresenter.searchPhoneinfo(MainPresenter.java:36)
at com.example.searchphone.MainActivity.onClick(MainActivity.java:44)
这几行,但是编写处理逻辑没有问题啊,请各位好心人看一下,谢谢!
代码:
package com.example.searchphone; import android.app.ProgressDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import com.example.searchphone.model.Phone; import com.example.searchphone.mvp.Presenter.MainPresenter; import com.example.searchphone.mvp.mvpMainView; public class MainActivity extends AppCompatActivity implements View.OnClickListener, mvpMainView { EditText input_phone; Button search; TextView result_phone; TextView result_province; TextView result_server; TextView result_carrier; MainPresenter mainPresenter; ProgressDialog progressDialog;//进度条 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); input_phone = (EditText) findViewById(R.id.input_phone);//引用部件 search = (Button) findViewById(R.id.search); result_carrier = (TextView) findViewById(R.id.result_carrier); result_phone = (TextView) findViewById(R.id.input_phone); result_province = (TextView) findViewById(R.id.result_province); result_server = (TextView) findViewById(R.id.result_server); search.setOnClickListener(this); mainPresenter = new MainPresenter(this); mainPresenter.Click(this); } @Override public void onClick(View view) { //错误的地方 mainPresenter.searchPhoneinfo(input_phone.getText().toString());//将手机号码传入mainpresenter } //mvpMainView接口的方法 @Override public void showToast(String msg) { Toast.makeText(this, msg, Toast.LENGTH_LONG).show(); } @Override public void updateView() { Phone phone = mainPresenter.getPhone(); result_phone.setText("手机号码" + phone.getTelephone()); result_province.setText("省份" + phone.getProvince()); result_server.setText("运营商" + phone.getServer()); result_carrier.setText("归属运营商" + phone.getCarrier()); } @Override public void showLoading() { if (progressDialog == null) { progressDialog = ProgressDialog.show(this, "提示", "正在加载...", false); } else if (progressDialog.isShowing()) { progressDialog.setTitle(""); progressDialog.setMessage("正在加载..."); } progressDialog.show(); } @Override public void hidenLoading() { if (progressDialog != null && progressDialog.isShowing()) { progressDialog.dismiss(); } } }
控制模块
package com.example.searchphone.mvp.Presenter; import com.example.searchphone.business.HttpUntil; import com.example.searchphone.model.Phone; import com.example.searchphone.mvp.mvpMainView; import org.json.JSONException; import org.json.JSONObject; import java.util.HashMap; import java.util.Map; /** *专注与mainactivity的逻辑 */ public class MainPresenter extends BasePresenter{ String murl="https;//tcc.taobao.com/cc/json/mobile_tel_segment.htm"; mvpMainView mvpmainView; Phone mphone; public Phone getPhone(){ return mphone; } public MainPresenter(mvpMainView mainView){ mvpmainView=mainView; //与view进行交互 } public void searchPhoneinfo(String phone){ if(phone.length()!=11){ mvpmainView.showToast("请输入正确的手机号码"); return; } mvpmainView.showLoading(); //接下来写http请求处理逻辑 sendHttp(phone); //错误的地方 } private void sendHttp(String phone){ Map<String,String>map=new HashMap<String,String>(); map.put("tel",phone); HttpUntil httpUntil =new HttpUntil(new HttpUntil.HttpResponse(){ //错误的地方 public void onSuccess(Object object){ String json=object.toString();//将object转化为string int index=json.indexOf("{");//截取前端多余字符,indexOf方法可返回某个指定的字符串值在字符串中首次出现的位置 json=json.substring(index,json.length()); //jsonObject mphone= parseModelWithOrgjson(json); mvpmainView.hidenLoading(); mvpmainView.updateView(); } public void onFail(String error){ mvpmainView.showToast(error); mvpmainView.hidenLoading(); } }); httpUntil.sendGetHttp(murl,map); } private Phone parseModelWithOrgjson(String json)//解析方法 { Phone phone =new Phone (); try { JSONObject jsonObject=new JSONObject(json); String value=jsonObject.getString("telphone"); phone.setTelephone(value); value=jsonObject.getString("province"); phone.setProvince(value); value=jsonObject.getString("server"); phone.setServer(value); value=jsonObject.getString("carrier"); phone.setCarrier(value); } catch (JSONException e) { e.printStackTrace(); } return phone; } }
OK HTTP框架使用
package com.example.searchphone.business; import android.os.Looper; import java.io.IOException; import java.nio.MappedByteBuffer; import java.util.Iterator; import java.util.Map; import android.os.Handler; import okhttp3.Call; import okhttp3.Callback; import okhttp3.MultipartBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; /** * Created by 陈茂洋 on 2018/10/30. */ public class HttpUntil { String murl; Map<String, String> mparam; HttpResponse mresponse; Handler myhandler = new Handler(Looper.getMainLooper()); private final OkHttpClient client = new OkHttpClient(); //错误的地方 public interface HttpResponse {//回调接口,拿到返回的数据 void onSuccess(Object object); void onFail(String error); } public HttpUntil(HttpResponse response) { mresponse = response; } //发送http public void sendPostHttp(String url, Map<String, String> param) { sendHttp(url, param, true); } //获取http public void sendGetHttp(String url, Map<String, String> param) { sendHttp(url, param, false); } //发送核心 private void sendHttp(String url, Map<String, String> param, boolean isPost) { murl = url; mparam = param; //编写请求逻辑 run(isPost); } //发送逻辑 private void run(boolean isPost) { Request request = createRequest(isPost); //创建请求队列 client.newCall(request).enqueue(new Callback() {//将request传递到队列中 @Override public void onFailure(Call call, IOException e) {//回调方法 if (mresponse != null) { myhandler.post(new Runnable() { public void run() { mresponse.onFail("请求错误"); } }); } } @Override public void onResponse(Call call, final Response response) throws IOException { if (mresponse == null) return; myhandler.post(new Runnable() { public void run() { if (!response.isSuccessful()) { mresponse.onFail("请求失败" + response); } else { try { mresponse.onSuccess(response.body().string()); } catch (IOException e) { e.printStackTrace(); mresponse.onFail("结果转换失败"); } } } }); } }); } //第一步完成client对象后,第二步设置request方法 private Request createRequest(boolean isPost) { Request request; if (isPost) { MultipartBody.Builder resquestBodyBuilder; resquestBodyBuilder = new MultipartBody.Builder();//实现上传文件或参数 resquestBodyBuilder.setType(MultipartBody.FORM); //便利map请求参数 /*获得map的迭代器,用作遍历map中的每一个键值对 Iterator是迭代器,map之前应该定义过,姑且认为是HashMap。 <Entry<String,String>>表示map中的键值对都是String类型的。 map.entrySet()是把HashMap类型的数据转换成集合类型 map.entrySet().iterator()是去获得这个集合的迭代器,保存在iter里面*/ Iterator<Map.Entry<String, String>> iterator = mparam.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<String, String> entry = iterator.next(); resquestBodyBuilder.addFormDataPart(entry.getKey(), entry.getValue());//把参数添加到请求数据中 } request = new okhttp3.Request.Builder().url(murl) .post(resquestBodyBuilder.build()).build();//创建请求 } else {//get的请求方式 String urlstr = murl + "?" + MapParamToString(mparam); request = new Request.Builder().url(urlstr).build(); } return request; } private String MapParamToString(Map<String, String> param) {//拼接地址和参数 StringBuilder stringBuilder = new StringBuilder(); Iterator<Map.Entry<String, String>> iterator = param.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<String, String> entry = iterator.next(); stringBuilder.append(entry.getKey() + "=" + entry.getValue() + "&"); } String str = stringBuilder.toString().substring(0, stringBuilder.length() - 1);//去掉最后一个符号为& return str; } }
Model
package com.example.searchphone.model; public class Phone { String telephone; String province; String server; String carrier; public String getServer() { return server; } public void setServer(String server) { this.server = server; } public String getTelephone() { return telephone; } public void setTelephone(String telephone) { this.telephone = telephone; } public String getCarrier() { return carrier; } public void setCarrier(String carrier) { this.carrier = carrier; } public String getProvince() { return province; } public void setProvince(String province) { this.province = province; } }
浪里小神龙
相关分类