Android对于访问请求数据,经常需要异步访问访问网络,请求数据。对于请求的数据需要传递给数据使用的地方。所以,Android中有好几种方式可以进行异步的数据传递。
接口异步数据请求
步骤:
1.定义一个接口,里面实现数据传递的方法
2.定义一个接口的对象
3.定义一个public的方法,用于对接口对象进行初始化
4.在异步传递数据的地方,调用接口里面的方法,参数为需要传递的数据
5.在需要接收数据的地方,实现接口。在对应的接口方法里面进行数据操作
具体实现
1.新建一个接口,里面定义数据返回成功和失败的方法。
interface getInterface{
void getDataSuccfess(String date);
void getDataFailed(String errot);
}
2.定义一个接口的对象
private getInterface mgetInterface;
3.定义一个公共方法。
public void setInterface(getInterface getInterface){ //其他类调用接口时的一个窗口
this.mgetToken=getToken;
}
4.在需要传递数据的地方调用接口的方法
new Thread(new Runnable() {
@Override
public void run() {
OkHttpUtils.post()
.url(Config.tokenUrl)
.addParams("app_id", Config.APPID)
.addParams("device_id", "x1000")
.addParams("timestamp", timestamp)
.addParams("nonce",strRand)
.addParams("signature", signature)
.build()
.execute(new StringCallback() {
@Override
public void onError(Request request, Exception e) {
}
@Override
public void onResponse(String response) {
Log.i(TAG, "onResponse: "+response);
try {
JSONObject object= new JSONObject(response);
JSONObject data = object.getJSONObject("data");
String token=data.getString("device_token");
if (mgetToken!=null){//先判断当前对象是都为空
mgetToken.getDevicetoken(token);
}
Log.i(TAG, "onResponse: "+data);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
}).start();
5.在需要接收数据的地方,调用公共的方法,实现接口的方法
setDevicetoken(new getToken() {
@Override
public void getDevicetoken(String token) {
}
});
整体代码如下:
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private static final String TAG = MainActivity.class.getSimpleName();
private tokenBean token;
private String timestamp;
private String signature;
private String strRand;
private getToken mgetToken;
private EditText mEditInput;
private Button mBtnQuery;
private TextView mShowView;
private Button mBtnList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init() {
initAPI();
initView();
initData();
setDevicetoken(new getToken() {
@Override
public void getDevicetoken(String token) {
}
});
}
private void initData() {
mBtnQuery.setOnClickListener(this);
}
private void QueryApi(final String input) {
new Thread(new Runnable() {
@Override
public void run() {
OkHttpUtils.post()
.url(Config.QUERYURL)
.addParams("app_id", Config.APPID)
.addParams("device_id", "x1000")
.addParams("timestamp", timestamp)
.addParams("nonce",strRand)
.addParams("signature", signature)
.addParams("content",input)
.build()
.execute(new StringCallback() {
@Override
public void onError(Request request, Exception e) {
}
@Override
public void onResponse(String response) {
Log.i(TAG, "onResponse: "+response);
Gson gson= new Gson();
QueryMusicBean queryMusicBean=gson.fromJson(response,QueryMusicBean.class);
String playUrl = queryMusicBean.getAudioinfos().getContents().get(0).getPlay_url_with_token();
Log.i(TAG, "onResponse: "+playUrl);
String str=queryMusicBean.getAudioinfos().getContents().get(0).getName();
Log.i(TAG, "onResponse: str+"+str);
Message msg=new Message();
msg.what=100;
msg.obj=playUrl;
mHandler.sendMessage(msg);
}
});
}
}).start();
}
Handler mHandler= new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 100:
mShowView.setText(msg.obj.toString());
Log.i(TAG, "handleMessage: "+msg.obj.toString());
break;
}
}
};
private void initView() {
mEditInput = (EditText) findViewById(R.id.edit_input);
mBtnQuery = (Button) findViewById(R.id.button);
mShowView = (TextView) findViewById(R.id.Tv_view);
mBtnList = (Button) findViewById(R.id.button2);
}
private void initAPI() {
//api授權
timestamp = new Date().getTime()+"";
Log.i(TAG, "init: time"+timestamp);
signature = sha1.encode(Config.APPID + Config.ServiceKey + timestamp);
Log.i(TAG, "init: "+signature);
strRand = "";
for (int i = 0; i < 32; i++) {
strRand += String.valueOf((int) (Math.random() * 10));
}
getToken();
}
public void getToken() {
new Thread(new Runnable() {
@Override
public void run() {
OkHttpUtils.post()
.url(Config.tokenUrl)
.addParams("app_id", Config.APPID)
.addParams("device_id", "x1000")
.addParams("timestamp", timestamp)
.addParams("nonce",strRand)
.addParams("signature", signature)
.build()
.execute(new StringCallback() {
@Override
public void onError(Request request, Exception e) {
}
@Override
public void onResponse(String response) {
Log.i(TAG, "onResponse: "+response);
try {
JSONObject object= new JSONObject(response);
JSONObject data = object.getJSONObject("data");
String token=data.getString("device_token");
if (mgetToken!=null){
mgetToken.getDevicetoken(token);
}
Log.i(TAG, "onResponse: "+data);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
}).start();
}
public void setDevicetoken(getToken getToken){ //其他类调用接口时的一个窗口
this.mgetToken=getToken;
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.button:
String input= mEditInput.getText().toString();
QueryApi(input);
Log.i(TAG, "onClick: "+input);
break;
case R.id.button2:
getList();
Log.i(TAG, "onClick: +List");
break;
}
}
/**
* 獲取列表
*/
private void getList() {
new Thread(new Runnable() {
@Override
public void run() {
OkHttpUtils.post()
.url(Config.LISTURL)
.addParams("app_id", "Foxconn000000001")
.addParams("device_id", "x1000")
.addParams("timestamp", "1508310642688")
.addParams("nonce","8SXtViQZzfSseKV2tV2nSJYFfhSeKzY4")
.addParams("signature","b70b8d4d7d7951adb3ea4439a0066aa10d9e6b62")
.build()
.execute(new StringCallback() {
@Override
public void onError(Request request, Exception e) {
Log.i(TAG, "onError: ");
}
@Override
public void onResponse(String response) {
Log.i(TAG, "onResponse: "+response);
Gson gson= new Gson();
listBean mlistBean= gson.fromJson(response,listBean.class);
String catName = mlistBean.getAudioinfos().getCats().get(0).getCat_name();
Log.i(TAG, "onResponse: catNamr+"+catName);
// Message msg=new Message();
// msg.what=100;
// msg.obj=playUrl;
// mHandler.sendMessage(msg);
}
});
}
}).start();
}
interface getToken{
void getDevicetoken(String token);
}
}
网友评论