今天介绍一个自己做的快递单号查询的简单APP,供大家参考。由于需要使用http和json,本文在build.gradle(module:app)添加了okhttp3依赖和gson依赖。
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:24.1.1'
testCompile 'junit:junit:4.12'
compile 'com.squareup.okhttp3:okhttp:3.6.0'
compile 'com.google.code.gson:gson:2.2.4'
}
看一下布局文件
ListView使用的item的布局
资源文件,首先是strings.xml
快递查询 请输入快递单号 查询 http://www.kuaidi100.com/query
这里我们使用了快递100的接口,然后看看arrays.xml
- 顺丰
- EMS
- 快捷
- shunfeng
- ems
- kuaijiesudi
只做了3个快递公司的查询,还有很多其他的支持,界面如图所示
下面看看代码,我们自定义一个Application类,主要通过资源,使用表驱动法动态构建一个快递公司中文名与请求时候的公司编码的映射表。
package com.yjp.deliverynoquerydemo.global;
import android.app.Application;
import com.yjp.deliverynoquerydemo.R;
import java.util.HashMap;
import java.util.Map;
public class MyApplication extends Application {
private Map mDeliveryCompanyTable = new HashMap<>();
public String getDeliveryCompanyNo(String deliveryCompanyName) throws RuntimeException {
if (mDeliveryCompanyTable.isEmpty()) {
String[] names = getResources().getStringArray(R.array.delivery_company);
String[] ids = getResources().getStringArray(R.array.delivery_company_id);
if (names.length != ids.length) {
throw new RuntimeException();
}
for (int i = 0; i < names.length; i++) {
mDeliveryCompanyTable.put(names[i], ids[i]);
}
}
return mDeliveryCompanyTable.get(deliveryCompanyName);
}
}
然后是模型,用来记录获取回来的快递状态信息
package com.yjp.deliverynoquerydemo.modal;
import java.util.List;
public class DeliveryMessages {
//派送单号
private String nu;
//快递公司名称
private String com;
//快递信息
private List data;
//消息类
public static class Message {
//时间,格式为年-月-日 时:分:秒
private String time;
//详细信息内容
private String context;
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getContext() {
return context;
}
public void setContext(String context) {
this.context = context;
}
}
public String getNu() {
return nu;
}
public void setNu(String nu) {
this.nu = nu;
}
public String getCom() {
return com;
}
public void setCom(String com) {
this.com = com;
}
public List getData() {
return data;
}
public void setData(List data) {
this.data = data;
}
}
一个用来通过http获取快递信息的工具类,这里我们使用了okHttp3和gson
package com.yjp.deliverynoquerydemo.tools;
import com.google.gson.Gson;
import com.yjp.deliverynoquerydemo.modal.DeliveryMessages;
import java.io.IOException;
import java.net.SocketTimeoutException;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class DeliveryMessageGetter {
//异步请求监听接口
public interface DeliveryMessageGetterListener {
void onSuccess(DeliveryMessages deliveryMessages);
void onFailure(String errorStr);
}
//okHttp
private OkHttpClient mOkHttpClient = new OkHttpClient.Builder()
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.connectTimeout(10, TimeUnit.SECONDS)
.build();
//异步GET请求
public void getAsync(final String url,
final Map params,
final DeliveryMessageGetterListener listener) {
//构建请求URL
String requestString = url;
if (!params.isEmpty()) {
requestString += "?";
for (Map.Entry entry : params.entrySet()) {
requestString += entry.getKey() + "=" + entry.getValue() + "&";
}
requestString = requestString.substring(0, requestString.length() - 1);
}
//创建一个Request
final Request request = new Request.Builder()
.url(requestString)
.build();
//请求加入调度
Call call = mOkHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
if(e.getCause().equals(SocketTimeoutException.class)) {
listener.onFailure("查询超时");
} else {
listener.onFailure("查询失败");
}
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String messages = response.body().string();
Gson gson = new Gson();
DeliveryMessages deliveryMessages = gson.fromJson(messages, DeliveryMessages.class);
if (deliveryMessages != null) {
listener.onSuccess(deliveryMessages);
} else {
listener.onFailure("查询失败");
}
}
});
}
}
最后是我们的MainActivity
package com.yjp.deliverynoquerydemo;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Spinner;
import android.widget.Toast;
import com.yjp.deliverynoquerydemo.global.MyApplication;
import com.yjp.deliverynoquerydemo.modal.DeliveryMessages;
import com.yjp.deliverynoquerydemo.tools.DeliveryMessageGetter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.yjp.deliverynoquerydemo.modal.DeliveryMessages.Message;
public class MainActivity extends AppCompatActivity implements DeliveryMessageGetter.DeliveryMessageGetterListener {
private List
主要是调用接口,实现功能,代码比较好理解,不再赘述。最后给出Manifest文件
主要是替换了默认的Application类,然后让MainActivity默认不弹出软键盘。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。



