2016-04-03 2 views
-2

В настоящее время у меня есть активность, где мне нужно получить данные из базы данных анализа. Выборка должна выполняться только в том случае, если локальный хранилище данных пуст. Я попытался создать asynctask, а также использовать блоки if-else, тем не менее, управление переходит к следующим строкам кода перед извлечением данных, что приводит к сбою приложения. Как это сделать? Вот код:Как полностью выполнить метод, прежде чем перейти к следующим строкам кода?

public class Splash extends AppCompatActivity { 

    ArrayList<String> Titles = new ArrayList<>(); 
    ArrayList<String> Descriptions = new ArrayList<>(); 
    ArrayList<String> VideoIDs = new ArrayList<>(); 
    ArrayList<String> FullUrls = new ArrayList<>(); 
    ArrayList<String> IDsForYTsdk = new ArrayList<>(); 
    String lang, objCode;// englishObject, hindiObject ; 
    Intent intent; 
    Firebase myFirebaseRef; 
    ParseQuery<ParseObject> query = ParseQuery.getQuery("class"); 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_splash); 
     Window window = getWindow(); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 
      window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 
      window.setStatusBarColor(Color.parseColor("#512DA8")); 
     } 

     checkFirstRun()  /if first run, fetch from database 
     try { 
      FileInputStream fis = openFileInput(getResources().getString(R.string.FILENAME)); 
      BufferedReader br = new BufferedReader(new InputStreamReader(fis)); 
      String c; 
      lang = ""; 
      while ((c = br.readLine()) != null) { 
       lang = lang + c; 
      } 
      br.close(); 
      fis.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     intent = new Intent(Splash.this, MainActivity.class); 
     Thread timer = new Thread() { 
      @Override 
      public void run() { 
       super.run(); 
       //final ParseQuery<ParseObject> query = ParseQuery.getQuery("class");   //GET PARSEOBJECTS LIST FROM SERVER 
       try { 
        ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); 
        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); 
        if (networkInfo != null && networkInfo.isConnected()) { 
         //query.fromLocalDatastore();     //so user doesnt have to wait 
         query.whereExists("youtube_id"); 
         query.setLimit(30); 
         query.orderByDescending("updatedAt"); 
         if (lang.equals("en")) 
          query.whereEqualTo("language", "en"); 
         else if (lang.equals("hi")) 
          query.whereEqualTo("language", "hi"); 
         query.findInBackground(new FindCallback<ParseObject>() { 
          public void done(final List<ParseObject> idList, ParseException e) { 
           if (e == null) { 
            for (int i = 0; i < idList.size(); i++) { 
             Titles.add(i, idList.get(i).get("video_title").toString()); 
             Descriptions.add(i, idList.get(i).get("video_script").toString()); 
             VideoIDs.add(i, "https://www.youtube.com/embed/" + idList.get(i).get("youtube_id").toString() + "?rel=0&controls=0&showinfo=0&autoplay=1&modestbranding=1"); 
             IDsForYTsdk.add(i, YouTubeUrlParser.getVideoId(VideoIDs.get(i))); 
             FullUrls.add(i, "https://youtu.be/" + IDsForYTsdk.get(i)); 
            } 
            //Toast.makeText(getApplicationContext(), "IDs weren't same", Toast.LENGTH_SHORT).show(); 
            intent.putStringArrayListExtra("titles", Titles); 
            intent.putStringArrayListExtra("descs", Descriptions); 
            intent.putStringArrayListExtra("videoIds", VideoIDs); 
            intent.putStringArrayListExtra("idsForSDK", IDsForYTsdk); 
            intent.putStringArrayListExtra("links", FullUrls); 
            ParseObject.unpinAllInBackground("objectsID", idList, new DeleteCallback() { 
             public void done(ParseException e) { 
              if (e != null) { 
               return; 
              } 
              ParseObject.pinAllInBackground(idList); 
             } 
            }); 
            startActivity(intent); 
           } else { 
            e.printStackTrace(); 
            Toast.makeText(getApplicationContext(), "Couldn't fetch data", Toast.LENGTH_SHORT).show(); 
           } 
          } 
         }); 
        } else { 
         query.fromLocalDatastore(); 
         query.orderByDescending("updatedAt"); 
         if (lang.equals("en")) 
          query.whereEqualTo("language", "en"); 
         else if (lang.equals("hi")) 
          query.whereEqualTo("language", "hi"); 
         query.findInBackground(new FindCallback<ParseObject>() { 
          public void done(final List<ParseObject> idList, ParseException e) { 
           if (e == null) { 
            for (int i = 0; i < idList.size(); i++) { 
             Titles.add(i, idList.get(i).get("video_title").toString()); 
             Descriptions.add(i, idList.get(i).get("video_script").toString()); 
             VideoIDs.add(i, "https://www.youtube.com/embed/" + idList.get(i).get("youtube_id").toString() + "?rel=0&amp;controls=0&amp;showinfo=0&amp;autoplay=1"); 
             IDsForYTsdk.add(i, YouTubeUrlParser.getVideoId(VideoIDs.get(i))); 
             FullUrls.add(i, "https://youtu.be/" + IDsForYTsdk.get(i)); 
            } 
            intent.putStringArrayListExtra("titles", Titles); 
            intent.putStringArrayListExtra("descs", Descriptions); 
            intent.putStringArrayListExtra("videoIds", VideoIDs); 
            intent.putStringArrayListExtra("links", FullUrls); 
            intent.putStringArrayListExtra("idsForSDK", IDsForYTsdk); 
            //intent.putStringArrayListExtra("language", Language); 

            Toast.makeText(getApplicationContext(), "Fetched saved data", Toast.LENGTH_SHORT).show(); 
            startActivity(intent); 
           } else { 
            e.printStackTrace(); 
            Toast.makeText(getApplicationContext(), "Couldn't fetch saved data", Toast.LENGTH_SHORT).show(); 
           } 
          } 
         }); 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }; 
     timer.start(); 
    } 

    public void checkFirstRun() { 
     boolean isFirstRun = getSharedPreferences("PREFERENCE", MODE_PRIVATE).getBoolean("isFirstRun", true); 
     if (isFirstRun) { 
      ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); 
      NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); 
      if (networkInfo != null && networkInfo.isConnected()) { 
       try { 
        FileOutputStream fos = openFileOutput(getResources().getString(R.string.FILENAME), Context.MODE_PRIVATE); 
        fos.write(getResources().getString(R.string.ENGLISH).getBytes()); 
        fos = openFileOutput(getResources().getString(R.string.storeEnObjFile), Context.MODE_PRIVATE); 
        fos.write(getResources().getString(R.string.objEN).getBytes()); 
        fos = openFileOutput(getResources().getString(R.string.storeHiObjFile), Context.MODE_PRIVATE); 
        fos.write(getResources().getString(R.string.objHI).getBytes()); 
        fos.close(); 
        //Toast.makeText(this, "File created", Toast.LENGTH_SHORT).show(); 

        setUpAppOnFirstLaunch(); 

        FirebaseCode(); 

       } catch (Exception fne) { 
        fne.printStackTrace(); 
       } 
       getSharedPreferences("PREFERENCE", MODE_PRIVATE) 
         .edit() 
         .putBoolean("isFirstRun", false) 
         .apply(); 
      } else { 
       Toast.makeText(this, "Please connect to a network and try again.", Toast.LENGTH_LONG).show(); 
       finish(); 
      } 
     } 
    } 

    private void setUpAppOnFirstLaunch() { 
     query.whereExists("youtube_id"); 
     query.setLimit(30); 
     query.orderByDescending("updatedAt"); 
     if (lang.equals("en")) 
      query.whereEqualTo("language", "en"); 
     else if (lang.equals("hi")) 
      query.whereEqualTo("language", "hi"); 
     query.findInBackground(new FindCallback<ParseObject>() { 
      public void done(final List<ParseObject> idList, ParseException e) { 
       if (e == null) { 
        for (int i = 0; i < idList.size(); i++) { 
         Titles.add(i, idList.get(i).get("video_title").toString()); 
         Descriptions.add(i, idList.get(i).get("video_script").toString()); 
         VideoIDs.add(i, "https://www.youtube.com/embed/" + idList.get(i).get("youtube_id").toString() + "?rel=0&amp;controls=0&amp;showinfo=0&amp;autoplay=1"); 
         IDsForYTsdk.add(i, YouTubeUrlParser.getVideoId(VideoIDs.get(i))); 
         FullUrls.add(i, "https://youtu.be/" + IDsForYTsdk.get(i)); 
        } 
        //Toast.makeText(getApplicationContext(), "IDs weren't same", Toast.LENGTH_SHORT).show(); 
        intent.putStringArrayListExtra("titles", Titles); 
        intent.putStringArrayListExtra("descs", Descriptions); 
        intent.putStringArrayListExtra("videoIds", VideoIDs); 
        intent.putStringArrayListExtra("links", FullUrls); 
        intent.putStringArrayListExtra("idsForSDK", IDsForYTsdk); 
        ParseObject.unpinAllInBackground("objectsID", idList, new DeleteCallback() { 
         public void done(ParseException e) { 
          if (e != null) { 
           return; 
          } 
          ParseObject.pinAllInBackground(idList); 
         } 
        }); 
        startActivity(intent); 
       } else { 
        e.printStackTrace(); 
        Toast.makeText(getApplicationContext(), "Couldn't fetch data", Toast.LENGTH_SHORT).show(); 
       } 

      } 
     }); 
} 
+0

Если приложение аварийно завершает работу, включите журнал ошибок. Кроме того, это не [mcve]. Если ваш код не является синхронным или вы неправильно обрабатываете обратные вызовы, тогда код «будет пропущен», –

ответ

1

Если вы используете AsyncTask, а затем переопределить его метод onPostExecute и место любой метод, который вы хотите выполнить после вызова завершена.

Если вы используете Задайте исходные задачи, затем переопределите метод done() и поместите любой метод, который хотите выполнить.

Трудно дать вам конкретный код, ваш код ... очень грязный и трудно читаемый. Поэтому запомните приведенные выше советы и попробуйте.

1

Я не знаю. Если это правильный путь, но он работает для меня.

Если вы должны сделать что-то после того, как проверка делается из AsyncTask

  1. Выполнить следующую строку из onPostExecute() из async Task.

  2. Если вы не доступ к любой GUI компонент, который вы можете написать следующую строку, которую вы должны выполнить (которая вызывается, даже если она не находится в вашем случае) в конце doOnBackground от asyncTask

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