2013-09-30 4 views
0

В моем приложении я создаю базу данных при запуске приложения и с сервера, получая данные и вставляя их, которые работают хорошо. я написал запрос на сервер в задаче асинхронном нижеAndroid: Обновление базы данных с использованием Asynctask не работает

@Override 
    protected Void doInBackground(Void... params) { 
     try { 
      startWebServiceForExcelData(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return null; 

} 
void startWebServiceForData() throws IOException { 
    String URL = "http://10.XXX.36.XXX:8080/UserWeb/user1"; 
    String SOAP_NAMESPACE = "http://webservice.org/"; 
    String METHOD_NAME = "GetMonthlyData"; 
    String SOAP_ACTION = "http://webservice.org/UserWeb/GetMonthlyDataRequest"; 
    SoapObject soapObject; 
    soapObject = new SoapObject(SOAP_NAMESPACE, METHOD_NAME); 
    SoapSerializationEnvelope envp = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
    envp.dotNet = true; 
    envp.setOutputSoapObject(soapObject); 
    System.out.println("soapObject===>"+envp.bodyOut); 
    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 
    try { 
    androidHttpTransport.call(SOAP_ACTION, envp); 
    SoapPrimitive response = (SoapPrimitive)envp.getResponse(); 
    String result = response.toString(); 
    System.out.println("response data from server====="+result); 
    parseJson(result); 
    } catch (Exception e){}} 

Теперь РМКО разбор данных и вставки в базу данных, как показано ниже

private static void parseJson(String result) { 

    try { 
    JSONObject mainObject = new JSONObject(result); 
    JSONObject productObject = mainObject.getJSONObject(PRODUCT_CATEGORY); 

    JSONObject ActualObject = productObject.getJSONObject(ACTUALS); 
    JSONObject ActualvalueObject = ActualObject.getJSONObject(PRODUCT_VALUE); 
    JSONObject ActualvolumeObject = ActualObject.getJSONObject(PRODUCT_VOLUME); 

    dbHelper.open(); 
    System.out.println("table creating second time===================="); 
    dbHelper.insertActualvalues(ActualvalueObject,ActualvolumeObject,SQLITE_TABLE2); 
    System.out.println("parseJson===================="+SQLITE_TABLE2); 
    } catch (JSONException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

Приведенный выше код работает хорошо, сейчас актуальна проблема, я созданная кнопка обновления, при нажатии кнопки я удаляю значения в таблице, и я должен повторно вставить ее в новые значения, если значения на сервере будут обновлены.

при нажатии кнопки iam запускается еще одна asynctask2, здесь в onpreexecute iam удаляются значения и в методе onbackground iam, используя первую асинхронную задачу, которую я использовал ранее, чтобы загрузить данные и вставить, но он не вставляет второй раз. Код для asynctask2 ниже

public class UpdateDatabaseFile extends AsyncTask<String, Integer, Boolean> { 
    private static MyDBAdapter dbHelper; 
    private static Context context; 
    DownloadJSON task = new DownloadJSON(context);// instance of first async task 

    public UpdateDatabaseFile(Context context){ 
     this.context = context; 
     dbHelper = new MyDBAdapter(context); 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

     dbHelper.open(); 
     dbHelper.deleteActualvalues(); // deleting the values in table 
    } 
    @Override 
    protected Boolean doInBackground(String... arg0) { 
     task.execute(); 
     return true; 
    }} 

why it is not able to insert the values second time ,but inserting first time. can someone point me right direction. 

От отладки я обнаружил, что его не выполняет ниже линии во второй раз в parseJson() метод.

dbHelper.open(); 
    System.out.println("table creating second time===================="); 
    dbHelper.insertActualvalues(ActualvalueObject,ActualvolumeObject,SQLITE_TABLE2); 

ответ

0

См. here. Плохо начинать асинтексу из асинхронного потока, ее следует запускать из потока пользовательского интерфейса. Я предлагаю копировать startWebServiceForData() с вашего первого асинхронного вызова на второй и запускать его оттуда.

+1

Точно так же вы правы, вторая задача async должна запускаться в потоке ui: спасибо за ссылку, ее именно то, что я хочу, теперь мое приложение работает как ожидалось. большое спасибо. – teekib

Смежные вопросы