0

我想從一個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); 
       } 
      } 
     } 
    } 
} 

回答

1

如果你在錯誤日誌carefuly看,你會看到你的Chico.java類307線發生錯誤。所以雙擊這一行或滾動到代碼中的這一行來查看它出錯的地方。

但我認爲那是因爲你是手動調用onPreExecute()方法,並多次。如果你讀了HOWTO對本網站使用的AsyncTask爲Android:How to Use AsyncTask for AndroidAndroid developers site,你可以閱讀,你可能不叫onPreExecute(),doInBackground()和onPostExecute()手動,因爲它們會自動由Android,當你呼叫被叫execute()方法。

所以,我覺得這個最好的方法是添加你namevaluepairs中的一個ArrayList,並將其添加作爲參數傳遞給您的AsyncTask的構造。隨後,執行()你GrabURL的AsyncTask是這樣的:

grab.execute("http://192.168.1.150/check.php"); 

,因爲它不是需要添加您的PARAMS陣列形式的execute()方法。您不必在doInBackground()方法中更改任何代碼。

祝你好運!

有一個很好的發展。

+0

307行是此行 「grab.execute(新的String [] {」 http://192.168.1.150/check.php 「});」實際上,使用AsyncTask的方式與我以前做的一樣,所以我認爲它可能不是問題的原因。 – Conrad 2012-08-07 01:29:38

+0

@ user1502740我之前沒有對它進行過關注,但是您在while循環中啓動了AsyncTask。我還測試了這一點:當我在我的while循環之前初始化任務(和你一樣)時,我得到了同樣的錯誤。如果我調用新的GrabURL()。execute();在while循環中,它是完美的。在你的情況下,你將總是從任務中再次運行同一個對象,但是你必須從AsyncTask運行一個新的對象。解決方案:運行一些新的GrabURL(ArrayList )。execute();在您的while循環中使用ArrayList 傳遞給onPreExecute()的參數列表。氪 – 2012-08-07 08:28:40

+0

感謝你的幫助,我把您的建議和任務完成 – Conrad 2012-08-07 09:48:33