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