2017-01-18 7 views
1

У меня есть следующий код, где я хочу синхронизировать Mysql с SQLITE. Проблема в том, что когда я нажимаю кнопку синхронизации, появляется ошибка. Данные передаются с сервера Mysql на мой SQLITE, но он не будет отображаться в действии моего приложения, где я помещал данные в список.«Активность просочилась в окно, которое изначально было добавлено здесь»

public class MainActivity extends ActionBarActivity { 
    // DB Class to perform DB related operations 
    DBController controller = new DBController(this); 
    // Progress Dialog Object 
    ProgressDialog prgDialog; 
    HashMap<String, String> queryValues; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     // Get User records from SQLite DB 
     ArrayList<HashMap<String, String>> userList = controller.getAllUsers(); 
     // If users exists in SQLite DB 
     if (userList.size() != 0) { 
      // Set the User Array list in ListView 
      ListAdapter adapter = new SimpleAdapter(MainActivity.this, userList, R.layout.view_user_entry, new String[] { 
          "userId", "userName" }, new int[] { R.id.userId, R.id.userName }); 
      ListView myList = (ListView) findViewById(android.R.id.list); 
      myList.setAdapter(adapter); 
     } 
     // Initialize Progress Dialog properties 
     prgDialog = new ProgressDialog(this); 
     prgDialog.setMessage("Transferring Data from Remote MySQL DB and Syncing SQLite. Please wait..."); 
     prgDialog.setCancelable(false); 
     // BroadCase Receiver Intent Object 
     Intent alarmIntent = new Intent(getApplicationContext(), SampleBC.class); 
     // Pending Intent Object 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
     // Alarm Manager Object 
     AlarmManager alarmManager = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE); 
     // Alarm Manager calls BroadCast for every Ten seconds (10 * 1000), BroadCase further calls service to check if new records are inserted in 
     // Remote MySQL DB 
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis() + 5000, 10 * 1000, pendingIntent); 
    } 

    // Options Menu (ActionBar Menu) 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    // When Options Menu is selected 
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. 
     int id = item.getItemId(); 
     // When Sync action button is clicked 
     if (id == R.id.refresh) { 
      // Transfer data from remote MySQL DB to SQLite on Android and perform Sync 
      syncSQLiteMySQLDB(); 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    // Method to Sync MySQL to SQLite DB 
    public void syncSQLiteMySQLDB() { 
     // Create AsycHttpClient object 
     AsyncHttpClient client = new AsyncHttpClient(); 
     // Http Request Params Object 
     RequestParams params = new RequestParams(); 
     // Show ProgressBar 
     prgDialog.show(); 

     // Make Http call to getusers.php 
     client.post("http://download.grupsapte.ro/sinc/getusers.php", params, new AsyncHttpResponseHandler() { 
       @Override 
       public void onSuccess(String response) { 
        // Hide ProgressBar 
        prgDialog.hide(); 
        // Update SQLite DB with response sent by getusers.php 
        updateSQLite(response); 
       } 
       // When error occured 
       @Override 
       public void onFailure(int statusCode, Throwable error, String content) { 
        // TODO Auto-generated method stub 
        // Hide ProgressBar 
        prgDialog.hide(); 
        if (statusCode == 404) { 
         Toast.makeText(getApplicationContext(), "Requested resource not found", Toast.LENGTH_LONG).show(); 
        } else if (statusCode == 500) { 
         Toast.makeText(getApplicationContext(), "Something went wrong at server end", Toast.LENGTH_LONG).show(); 
        } else { 
         Toast.makeText(getApplicationContext(), "Unexpected Error occcured! [Most common Error: Device might not be connected to Internet]", 
           Toast.LENGTH_LONG).show(); 
        } 
       } 
     }); 
    } 

    public void updateSQLite(String response){ 
     ArrayList<HashMap<String, String>> usersynclist; 
     usersynclist = new ArrayList<HashMap<String, String>>(); 
     // Create GSON object 
     Gson gson = new GsonBuilder().create(); 
     try { 
      // Extract JSON array from the response 
      JSONArray arr = new JSONArray(response); 
      System.out.println(arr.length()); 
      // If no of array elements is not zero 
      if(arr.length() != 0){ 
       // Loop through each array element, get JSON object which has userid and username 
       for (int i = 0; i < arr.length(); i++) { 
        // Get JSON object 
        JSONObject obj = (JSONObject) arr.get(i); 
        System.out.println(obj.get("userId")); 
        System.out.println(obj.get("userName")); 
        // DB QueryValues Object to insert into SQLite 
        queryValues = new HashMap<String, String>(); 
        // Add userID extracted from Object 
        queryValues.put("userId", obj.get("userId").toString()); 
        // Add userName extracted from Object 
        queryValues.put("userName", obj.get("userName").toString()); 
        // Insert User into SQLite DB 
        controller.insertUser(queryValues); 
        HashMap<String, String> map = new HashMap<String, String>(); 
        // Add status for each User in Hashmap 
        map.put("Id", obj.get("userId").toString()); 
        map.put("status", "1"); 
        usersynclist.add(map); 
       } 
       // Inform Remote MySQL DB about the completion of Sync activity by passing Sync status of Users 
       updateMySQLSyncSts(gson.toJson(usersynclist)); 
       // Reload the Main Activity 
       reloadActivity(); 
      } 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    // Method to inform remote MySQL DB about completion of Sync activity 
    public void updateMySQLSyncSts(String json) { 
     System.out.println(json); 
     AsyncHttpClient client = new AsyncHttpClient(); 
     RequestParams params = new RequestParams(); 
     params.put("syncsts", json); 
     // Make Http call to updatesyncsts.php with JSON parameter which has Sync statuses of Users 
     client.post("http://download.grupsapte.ro/sinc/updatesyncsts.php", params, new AsyncHttpResponseHandler() { 
      @Override 
      public void onSuccess(String response) { 
       Toast.makeText(getApplicationContext(), "MySQL DB has been informed about Sync activity", Toast.LENGTH_LONG).show(); 
      } 

      @Override 
      public void onFailure(int statusCode, Throwable error, String content) { 
        Toast.makeText(getApplicationContext(), "Error Occured", Toast.LENGTH_LONG).show(); 
      } 
     }); 
    } 

    // Reload MainActivity 
    public void reloadActivity() { 
     Intent objIntent = new Intent(getApplicationContext(), MainActivity.class); 
     startActivity(objIntent); 
    } 
} 

И ошибка заключается в следующем:

01-18 12:54:59.821: E/WindowManager(2022): android.view.WindowLeaked: Activity com.prgguru.example.MainActivity has leaked window com.android.internal.policy.PhoneWindow$DecorView{a19b187 G.E...... R.....ID 0,0-1336,384} that was originally added here 
01-18 12:54:59.821: E/WindowManager(2022): at android.view.ViewRootImpl.<init>(ViewRootImpl.java:565) 
01-18 12:54:59.821: E/WindowManager(2022): at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:326) 
01-18 12:54:59.821: E/WindowManager(2022): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
01-18 12:54:59.821: E/WindowManager(2022): at android.app.Dialog.show(Dialog.java:350) 
01-18 12:54:59.821: E/WindowManager(2022): at com.prgguru.example.MainActivity.syncSQLiteMySQLDB(MainActivity.java:96) 
01-18 12:54:59.821: E/WindowManager(2022): at com.prgguru.example.MainActivity.onOptionsItemSelected(MainActivity.java:83) 
01-18 12:54:59.821: E/WindowManager(2022): at android.app.Activity.onMenuItemSelected(Activity.java:3204) 
01-18 12:54:59.821: E/WindowManager(2022): at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:353) 
01-18 12:54:59.821: E/WindowManager(2022): at android.support.v7.app.ActionBarActivity.superOnMenuItemSelected(ActionBarActivity.java:244) 
01-18 12:54:59.821: E/WindowManager(2022): at android.support.v7.app.ActionBarActivityDelegateICS.onMenuItemSelected(ActionBarActivityDelegateICS.java:165) 
01-18 12:54:59.821: E/WindowManager(2022): at android.support.v7.app.ActionBarActivity.onMenuItemSelected(ActionBarActivity.java:130) 
01-18 12:54:59.821: E/WindowManager(2022): at android.support.v7.app.ActionBarActivityDelegateICS$WindowCallbackWrapper.onMenuItemSelected(ActionBarActivityDelegateICS.java:300) 
01-18 12:54:59.821: E/WindowManager(2022): at com.android.internal.policy.PhoneWindow.onMenuItemSelected(PhoneWindow.java:1259) 
01-18 12:54:59.821: E/WindowManager(2022): at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:801) 
01-18 12:54:59.821: E/WindowManager(2022): at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:155) 
01-18 12:54:59.821: E/WindowManager(2022): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:954) 
01-18 12:54:59.821: E/WindowManager(2022): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:944) 
01-18 12:54:59.821: E/WindowManager(2022): at android.widget.ActionMenuView.invokeItem(ActionMenuView.java:655) 
01-18 12:54:59.821: E/WindowManager(2022): at com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:251) 
01-18 12:54:59.821: E/WindowManager(2022): at android.view.View.performClick(View.java:5697) 
01-18 12:54:59.821: E/WindowManager(2022): at android.widget.TextView.performClick(TextView.java:10826) 
01-18 12:54:59.821: E/WindowManager(2022): at android.view.View$PerformClick.run(View.java:22526) 
01-18 12:54:59.821: E/WindowManager(2022): at android.os.Handler.handleCallback(Handler.java:739) 
01-18 12:54:59.821: E/WindowManager(2022): at android.os.Handler.dispatchMessage(Handler.java:95) 
01-18 12:54:59.821: E/WindowManager(2022): at android.os.Looper.loop(Looper.java:158) 
01-18 12:54:59.821: E/WindowManager(2022): at android.app.ActivityThread.main(ActivityThread.java:7225) 
01-18 12:54:59.821: E/WindowManager(2022): at java.lang.reflect.Method.invoke(Native Method) 
01-18 12:54:59.821: E/WindowManager(2022): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
01-18 12:54:59.821: E/WindowManager(2022): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

Я знаю, что я должен поставить this.finish() где-то, но я не знаю, где именно. Надеюсь, кто-то мне поможет.

+0

см. это ... http://stackoverflow.com/questions/21817888/activity-has -открытый-окно-андроид –

+0

Возможный дубликат [Действие имеет просочившееся окно, которое было первоначально добавлено] (http://stackoverflow.com/questions/2850573/activity-has-leaked-window-that-was-originally-added) – AxelH

+0

Возможный дубликат [Activity has просочилось окно [email protected], которое было первоначально добавлено здесь] (http://stackoverflow.com/questions/11957409/activity-has-leaked-window-com-android-internal- policy-impl-phonewindowdecorvie) –

ответ

1
public void syncSQLiteMySQLDB() { 
    // Create AsycHttpClient object 
    AsyncHttpClient client = new AsyncHttpClient(); 
    // Http Request Params Object 
    RequestParams params = new RequestParams(); 
    // Show ProgressBar 
    prgDialog = new ProgressDialog(MainActivity.this); 
    prgDialog.setMessage("Transferring Data from Remote MySQL DB and Syncing SQLite. Please wait..."); 
    prgDialog.setCancelable(false); 
    prgDialog.show(); 

    // Make Http call to getusers.php 
    client.post("http://download.grupsapte.ro/sinc/getusers.php", params, new AsyncHttpResponseHandler() { 
      @Override 
      public void onSuccess(String response) { 

       // Update SQLite DB with response sent by getusers.php 
       updateSQLite(response); 
      } 
      // When error occured 
      @Override 
      public void onFailure(int statusCode, Throwable error, String content) { 
       // TODO Auto-generated method stub 

       if (statusCode == 404) { 
        Toast.makeText(getApplicationContext(), "Requested resource not found", Toast.LENGTH_LONG).show(); 
       } else if (statusCode == 500) { 
        Toast.makeText(getApplicationContext(), "Something went wrong at server end", Toast.LENGTH_LONG).show(); 
       } else { 
        Toast.makeText(getApplicationContext(), "Unexpected Error occcured! [Most common Error: Device might not be connected to Internet]", 
          Toast.LENGTH_LONG).show(); 
       } 
      } 

      @Override 
      public void onFinish(){ 
       // Hide ProgressBar 
       if(prgDialog.isShowing()) 
       prgDialog.hide(); 
      } 
    }); 

}

Прежде всего, вы должны объявить локальный объект прогресс бар и инициализировать MainActivity.this также AsyncHttpClient имеют метод onFinish(), который будет вызывать после успеха или неудачи называют так что вам нужно всего лишь скрыть ваш индикатор выполнения в методе onfinsh, и вы всегда должны проверить, отображается ли индикатор выполнения или нет, поэтому он не приведет к генерации excepetion.

+0

Вы должны объяснить, что вы сделали и почему. Только ответы на код обычно не помогают. – AxelH

+0

@AxelH Спасибо за ваше предложение :) –

+0

ok..so ошибка исчезла, но я не знаю, почему список, откуда я получаю данные, не заполняется. – user1147188

0

Попробуйте, Перед отображением диалогового окна прогресса. Проверьте, не показывает ли он, если да, отклоните его и покажите диалог.

В syncSQLiteMySQLDB отображается диалог выполнения. Сначала проверьте, что у вас уже есть экземпляр prgDialog и его , показывающий. Затем отпустите существующий prgDialog и покажите. и проверьте, не закончила ли операция перед ее показом.

public void syncSQLiteMySQLDB() { 
.... 
if(!isFinishing()) { 
    if(prgDialog !=null) { 
     if(prgDialog.isShowing()) { 
       prgDialog.dismiss() 
     } 
     prgDialog.show(); 
    } 

    } 
} 
+1

Почему? Когда ? Где ? Пожалуйста, объясните свое решение, отредактировав свой ответ. – AxelH

+0

@AxelH Я ценю ваше предложение: – Raghavendra

0

вам нужно dismiss() в progressDialog

@Override 
      public void onSuccess(String response) { 
       // dismiss ProgressBar 
       if (prgDialog != null) { 
       prgDialog.dismiss(); //not hide try dismiss the dialog 
       // Update SQLite DB with response sent by getusers.php 
       updateSQLite(response); 
      } 
     } 

также в вашем onFailure методы dismiss() в dialog

0

вы перегрузочная деятельность, не закрывая ваш диалог, так что вы должны уволить первую ,

public void reloadActivity() { 
      // dissmiss dialog first then reload activity. 
      if(prgDialog.isShowing()) { 
       prgDialog.dismiss(); 
       Intent objIntent = new Intent(getApplicationContext(), MainActivity.class); 
       startActivity(objIntent); 
      } 

    } 

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

  • Нет связанных вопросов^_^