看代碼:
for (int i = 0; i < objlist.size(); i++) {
final int s1 = i;
new Thread() {
@Override
public void run() {
super.run();
OkHttpClient okhttp = new OkHttpClient();
FormBody.Builder formBody = new FormBody.Builder();
formBody.add("act", "UploadBase64");
formBody.add("imgstr", m);
Request requestbuild = new Request.Builder()
.url(mConfig.SITE_API).post(formBody.build()).build();
;
Call lastcall = okhttp.newCall(requestbuild);
try {
Response execute = lastcall.execute();
String text = execute.body().string();
Message message = handler.obtainMessage();
message.what = s1;
//message.what=1;
message.obj = text;
message.sendToTarget();
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
問題:objlist這個ArrayList數量不定,一般4、5個資料,其中傳遞的引數m資料量較大,每次這樣向服務器post資料總是只有最后1、2個成功。
期望結果:能讀取objlist這個ArrayList數量,全部傳輸成功,并每成功一個請求,在前端顯示成功請求資訊。
請老師教我,感謝!
uj5u.com熱心網友回復:
public class UploadTask extends AsyncTask<String,Void,String[]>//Params, Progress, Result
{
@Override
protected void onPostExecute(String[] message) {
super.onPostExecute(message);
String what= message[0];
String text=message[1];
//在這里處理上傳完畢之后的事情,這個是ui執行緒不用擔心執行緒問題
}
//引數imgstrs里面存放兩個東西imgstrs[0]存放的m imgstrs[1]存放的index用于回傳值使用
@Override
protected String[] doInBackground(String... imgstrs) {
//這里是作業執行緒,請求網路的代碼
//定義回傳的string陣列
String[] retstr=new String[2];
//請求網路
OkHttpClient okhttp = new OkHttpClient();
FormBody.Builder formBody = new FormBody.Builder();
formBody.add("act", "UploadBase64");
formBody.add("imgstr", imgstrs[0]);
Request requestbuild = new Request.Builder()
.url(mConfig.SITE_API).post(formBody.build()).build();
;
Call lastcall = okhttp.newCall(requestbuild);
try {
Response execute = lastcall.execute();
String text = execute.body().string();
//我把retstr存放兩個東西 retstr[0]存放index retstr[1]存放網路上回傳的text
retstr[0]=imgstrs[1];
retstr[1]=text;
} catch (Exception e) {
e.printStackTrace();
}
return retstr;
}
}
//使用方法
private void Example()
{
for (int i = 0; i < objlist.size(); i++) {
final int s1 = i;
String [] params=new String[2];
params[0]=m;
params[1]=i.ToString();
//創建一個task,把引數傳入
new UploadTask().execute(params);
}
}
用Task來取代Thread+Handler,這里的問題在于 final int s1 = i;這句代碼引發了執行緒同步問題,你可以先用我的代碼試試,有問題再咨詢我.另外這種回圈一次產生一個執行緒去提交是不推薦的.你應該把回圈放到執行緒里去操作.作業執行緒本來就是用來處理這種耗時的操作的
uj5u.com熱心網友回復:
非常感謝您的回答,請問回圈放到執行緒里去這個操作能給個例子嗎?轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/253677.html
標籤:Android
