這篇文章給大家介紹Android中AsyncTask如何使用現(xiàn)的問(wèn)題,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
成都創(chuàng)新互聯(lián)公司專注于行唐企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,商城開(kāi)發(fā)。行唐網(wǎng)站建設(shè)公司,為行唐等地區(qū)提供建站服務(wù)。全流程按需定制開(kāi)發(fā),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)
問(wèn)題描述
這里我只寫(xiě)出AsyncTask的這些代碼,講述一下
@Override
protected String doInBackground(String... strings) {
String tranname=strings[0];
String transdata=strings[1];
String recvData="";
try {
//連接SOCKET客戶端
socketinfo=dataTransSocket.SocketConnect(msyscfg);
if (socketinfo.retno != -1) {
clientData=new CSocketClientData();
clientData.transName=tranname;
clientData.data=transdata;
//獲取數(shù)據(jù)
recvData=dataTransSocket.SocketSenduntilRecvStr(clientData);
dataTransSocket.SocketDisconnect();
} else {
recvData=socketinfo.retmsg;
}
} catch (Exception e) {
e.printStackTrace();
Log.i("socket", e.getMessage());
recvData=e.getMessage();
}
return recvData;
}
@Override
protected void onPostExecute(String recvdata) {
super.onPostExecute(recvdata);
mnetinfocallback.onNetinfoCallBackOver(clientData.transName, recvdata);
}
主程序界面的回調(diào)方法
上面代碼中,Socket在正常情況下獲取到數(shù)據(jù)后都可以直接調(diào)用下面的回調(diào)方法把數(shù)據(jù)傳遞回去,在后面測(cè)試過(guò)程中,我們把Socket的服務(wù)端關(guān)閉后,讓其Socket的連接失敗,照上圖的話應(yīng)該直接在回調(diào)函數(shù)中用Toast提示出返回的信息了。
結(jié)果我們?cè)跍y(cè)試中發(fā)現(xiàn),Socket連接失敗后程序直接崩潰了,如下圖
調(diào)試中我們打開(kāi)了LogCat看了一下,上面寫(xiě)著onPostExecute的問(wèn)題
然后我們加入斷點(diǎn)進(jìn)行跟蹤,發(fā)現(xiàn)啟用回調(diào)函數(shù)后并沒(méi)有在主進(jìn)程中進(jìn)來(lái),然后就崩潰了,這里我就直接在網(wǎng)上找找相關(guān)的資料后也沒(méi)查出來(lái)什么東西,不過(guò)在一篇文章里看到了下圖說(shuō)
解決方法
按上面的理解,那我們把輸出的參數(shù)做一個(gè)中間轉(zhuǎn)換再試試,改后的代碼為
@Override
protected String doInBackground(String... strings) {
String tranname=strings[0];
String transdata=strings[1];
String recvData="";
try {
//連接SOCKET客戶端
socketinfo=dataTransSocket.SocketConnect(msyscfg);
if (socketinfo.retno != -1) {
clientData=new CSocketClientData();
clientData.transName=tranname;
clientData.data=transdata;
//獲取數(shù)據(jù)
recvData=dataTransSocket.SocketSenduntilRecvStr(clientData);
recvData=mnetinfocallback.Success + "|" + recvData;
dataTransSocket.SocketDisconnect();
} else {
recvData=mnetinfocallback.Fail + "|" + socketinfo.retmsg;
}
} catch (Exception e) {
e.printStackTrace();
Log.i("socket", e.getMessage());
recvData=mnetinfocallback.Fail + "|" + e.getMessage();
}
return recvData;
}
@Override
protected void onPostExecute(String recvdata) {
super.onPostExecute(recvdata);
String[] strings=recvdata.split("\\|");
if (strings[0].equals(mnetinfocallback.Success)) {
if (!strings[1].equals("")) {
Log.i("post", strings[1]);
mnetinfocallback.onNetinfoCallBackOver(clientData.transName, strings[1]);
}
} else {
mnetinfocallback.onNetinfoCallBackOver(mnetinfocallback.Fail, strings[1]);
}
}
我們重新運(yùn)行后,發(fā)現(xiàn)正常彈出問(wèn)題了
關(guān)于Android中AsyncTask如何使用現(xiàn)的問(wèn)題就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。