Android:AsyncThread迫使我关闭我的应用程序

时间:2012-08-03 19:56:39

标签: android multithreading

我对Android比较陌生。我正在尝试使用AsyncTask但是在执行线程之后,我的应用程序迫使我关闭它。在我的Async线程中,我在服务器端执行php,从而保存来自Android传感器的数据。任何帮助将受到高度赞赏。感谢

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);        
 .....
 final FuncionsActivity functions = new FuncionsActivity();
 if(something)
    functions.execute(nameValuePairs); 
 .....
  }

 private class FuncionsActivity extends 
       AsyncTask<ArrayList<NameValuePair>, Integer, Integer > {
    @Override
    protected Integer doInBackground(ArrayList<NameValuePair>... data) {
         // 1) Connect via HTTP. 2) Encode data. 3) Send data.
        try
        {
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new     

                  HttpPost("http://.../saveCoordinates.php");                           
            //HttpPost httppost = new 
            httppost.setEntity(new UrlEncodedFormEntity(data[0]));
            HttpResponse response = httpclient.execute(httppost);
            Log.i("postData", response.getStatusLine().toString());
            this.onPostExecute(null);
                //Could do something better with response.
        }
        catch(Exception e)
        {
            Log.e("log_tag", "Error1:  " + e.toString());
        }
      return 0;     
      }

      protected void onProgressUpdate(Integer... item){
            Log.d("TestP", item[0] + " item has been processed");
      }

      protected void onPostExecute(Integer result){
            Log.d("TestP", "AsyncTask returned : " + result);
      }
 }

@Override
protected void onDestroy() {            
    super.onDestroy(); // Move to bottom
    //System.runFinalizersOnExit(true);
}
}

3 个答案:

答案 0 :(得分:1)

您无需亲自致电onPostExecute(),系统会根据您在doInBackground()中返回的内容进行操作。

我想将线路更改为return null,就像其他答案所说的那样,可以解决问题,但这可能不是你想要的。您可能希望返回从响应中提取的整数或其他内容。

您的代码中的另一个奇怪的事情是data[0],数据是一个ArrayList,是否可以编译?您也无法定义新的变量数据,因为这会产生重复的变量编译器错误。

答案 1 :(得分:0)

尝试更改此内容:

this.onPostExecute(null);

到此:

return null;

答案 2 :(得分:0)

为什么要尝试在后台方法中调用后执行方法。它会自动调用。删除它并尝试

希望有所帮助