В моем приложении я создаю базу данных при запуске приложения и с сервера, получая данные и вставляя их, которые работают хорошо. я написал запрос на сервер в задаче асинхронном ниже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);
Точно так же вы правы, вторая задача async должна запускаться в потоке ui: спасибо за ссылку, ее именно то, что я хочу, теперь мое приложение работает как ожидалось. большое спасибо. – teekib