我想從一個CSV文件中讀取數據,然後將這些數據發送到服務器進行處理將數據發送到服務器,但是,當我點擊按鈕,從文件中讀取數據,然後嘗試發送到服務器,錯誤存在,我的應用程序意外地發生。錯誤使用的AsyncTask
以下是在錯誤日誌中的消息:
08-06 17:04:32.168: E/AndroidRuntime(10468): FATAL EXCEPTION: main
08-06 17:04:32.168: E/AndroidRuntime(10468): java.lang.IllegalStateException: Cannot execute task: the task is already running.
08-06 17:04:32.168: E/AndroidRuntime(10468): at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:575)
08-06 17:04:32.168: E/AndroidRuntime(10468): at android.os.AsyncTask.execute(AsyncTask.java:534)
08-06 17:04:32.168: E/AndroidRuntime(10468): at Android.Chico.Chico$3.onClick(Chico.java:307)
08-06 17:04:32.168: E/AndroidRuntime(10468): at android.view.View.performClick(View.java:4084)
08-06 17:04:32.168: E/AndroidRuntime(10468): at android.view.View$PerformClick.run(View.java:16966)
08-06 17:04:32.168: E/AndroidRuntime(10468): at android.os.Handler.handleCallback(Handler.java:615)
08-06 17:04:32.168: E/AndroidRuntime(10468): at android.os.Handler.dispatchMessage(Handler.java:92)
08-06 17:04:32.168: E/AndroidRuntime(10468): at android.os.Looper.loop(Looper.java:137)
08-06 17:04:32.168: E/AndroidRuntime(10468): at android.app.ActivityThread.main(ActivityThread.java:4745)
08-06 17:04:32.168: E/AndroidRuntime(10468): at java.lang.reflect.Method.invokeNative(Native Method)
08-06 17:04:32.168: E/AndroidRuntime(10468): at java.lang.reflect.Method.invoke(Method.java:511)
08-06 17:04:32.168: E/AndroidRuntime(10468): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
08-06 17:04:32.168: E/AndroidRuntime(10468): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-06 17:04:32.168: E/AndroidRuntime(10468): at dalvik.system.NativeStart.main(Native Method)
我看到相同類型的錯誤之前,我所知道的的AsyncTask可以執行一次此異常可能會出現,所以我創建了一個新的AsyncTask每次然而,錯誤出現,所以我想問一下可能的原因是什麼?
這裏是我的代碼:
public class Chico extends Activity {
GrabURL grab;
Button btnfinish;
Button btninsert;
List<String[]> CSVData = new ArrayList<String[]>();
Boolean Insert = false;
Boolean Continue = false;
int numrecord=0;
@Override
public void onCreate(Bundle savedInstanceState) {
//create the activity
super.onCreate(savedInstanceState);
//set up the layout
setContentView(R.layout.activity_chico);
btninsert = (Button) findViewById(R.id.Insert);
if(new File(Environment.getExternalStorageDirectory()+"/Chico/record.csv").exists()){
btninsert.setVisibility(View.VISIBLE);
}else{
btninsert.setVisibility(View.GONE);
}
btnfinish = (Button) findViewById(R.id.Finish);
btnfinish.setVisibility(View.GONE);
grab = new GrabURL();
btninsert.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(!Continue){
Insert = true;
Continue = true;
btninsert.setVisibility(View.GONE);
try {
BufferedReader reader = new BufferedReader(new FileReader(Environment.getExternalStorageDirectory()+"/Chico/record.csv"));
try {
String line;
while ((line = reader.readLine()) != null){
String[] RowData = line.split(",");
CSVData.add(RowData);
}
} catch (IOException ex) {
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
grab = new GrabURL();
}
if(numrecord==CSVData.size())
btnfinish.setVisibility(View.VISIBLE);
while(numrecord<CSVData.size()){
grab.onPreExecute("TechID", Build.SERIAL);
grab.onPreExecute("ClientID", CSVData.get(numrecord)[0]);
grab.onPreExecute("SiteID", CSVData.get(numrecord)[1]);
grab.onPreExecute("Type", CSVData.get(numrecord)[2]);
grab.onPreExecute("LogTime", CSVData.get(numrecord)[3]);
if(CSVData.get(numrecord)[2]=="Checkin"){
grab.onPreExecute("Remark", "");
}else{
grab.onPreExecute("Remark", CSVData.get(numrecord)[4]);
}
grab.execute(new String[]{"http://192.168.1.150/check.php"});
}
}
});
btnfinish.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
finish();
}
});
}
private class GrabURL extends AsyncTask<String, Void, Void>{
//ArrayList object for storing the string pairs
ArrayList<NameValuePair> nameValuePairs;
public GrabURL() {
//constructor of the class
nameValuePairs = new ArrayList<NameValuePair>();
}
protected void onPreExecute(String key, String value) {
//store the pair of values into the ArrayList
nameValuePairs.add(new BasicNameValuePair(key,value));
}
@Override
protected Void doInBackground(String... urls) {
// TODO Auto-generated method stub
//Operation being executed in another thread
try{
//set up the type of HTTPClient
HttpClient client = new DefaultHttpClient();
//set up the location of the server
HttpPost post = new HttpPost(urls[0]);
//translate form of pairs to UrlEncodedFormEntity
UrlEncodedFormEntity ent = new UrlEncodedFormEntity(nameValuePairs,HTTP.UTF_8);
//set up the entity being sent by post method
post.setEntity(ent);
//execute the url and post the values
//client.execute(post);
HttpResponse responsePOST = client.execute(post);
HttpEntity resEntity = responsePOST.getEntity();
line = EntityUtils.toString(resEntity);
} catch (Exception e) {
//catch the exception
line = "Can't connect to server";
}
return null;
}
protected void onPostExecute(Void unused) {
if(Insert){
if(line.equals("Check in record has been inserted!") ||
line.equals("Check out record has been inserted!")){
btninsert.setVisibility(View.VISIBLE);
numrecord++;
} else if(line.equals("Can't connect to server")) {
btnfinish.setVisibility(View.VISIBLE);
}
}
}
}
}
307行是此行 「grab.execute(新的String [] {」 http://192.168.1.150/check.php 「});」實際上,使用AsyncTask的方式與我以前做的一樣,所以我認爲它可能不是問題的原因。 – Conrad 2012-08-07 01:29:38
@ user1502740我之前沒有對它進行過關注,但是您在while循環中啓動了AsyncTask。我還測試了這一點:當我在我的while循環之前初始化任務(和你一樣)時,我得到了同樣的錯誤。如果我調用新的GrabURL()。execute();在while循環中,它是完美的。在你的情況下,你將總是從任務中再次運行同一個對象,但是你必須從AsyncTask運行一個新的對象。解決方案:運行一些新的GrabURL(ArrayList)。execute();在您的while循環中使用ArrayList 傳遞給onPreExecute()的參數列表。氪 –
2012-08-07 08:28:40
感謝你的幫助,我把您的建議和任務完成 – Conrad 2012-08-07 09:48:33