Android 如何在跳到下一行代码之前完全执行方法?

Android 如何在跳到下一行代码之前完全执行方法?,android,parse-platform,Android,Parse Platform,我目前有一个活动,需要从解析数据库获取数据。仅当本地数据存储为空时才应执行抓取。我尝试过创建一个asynctask以及使用if-else块,但是,控件在获取数据之前会跳转到下一行代码,导致应用程序崩溃。我如何做到这一点? 代码如下: public class Splash extends AppCompatActivity { ArrayList<String> Titles = new ArrayList<>(); ArrayList<Strin

我目前有一个活动,需要从解析数据库获取数据。仅当本地数据存储为空时才应执行抓取。我尝试过创建一个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();
                }

            }
        });
}
公共类启动扩展了AppCompative活动{
ArrayList Titles=新的ArrayList();
ArrayList Descriptions=新的ArrayList();
ArrayList VideoId=新的ArrayList();
ArrayList FullUrls=新的ArrayList();
ArrayList IDsForYTsdk=新的ArrayList();
字符串lang,objCode;//englishObject,hindiObject;
意图;
Firebase myFirebaseRef;
ParseQuery=ParseQuery.getQuery(“类”);
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
Window=getWindow();
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.LOLLIPOP){
window.clearFlags(WindowManager.LayoutParams.FLAG\u半透明\u状态);
添加标志(WindowManager.LayoutParams.FLAG\u绘图\u系统\u栏\u背景);
window.setStatusBarColor(Color.parseColor(“#512DA8”);
}
checkFirstRun()/如果是第一次运行,则从数据库获取
试一试{
FileInputStream fis=openFileInput(getResources().getString(R.string.FILENAME));
BufferedReader br=新的BufferedReader(新的InputStreamReader(fis));
字符串c;
lang=“”;
而((c=br.readLine())!=null){
lang=lang+c;
}
br.close();
fis.close();
}捕获(例外e){
e、 printStackTrace();
}
意图=新意图(Splash.this、MainActivity.class);
线程计时器=新线程(){
@凌驾
公开募捐{
super.run();
//final ParseQuery query=ParseQuery.getQuery(“类”);//从服务器获取PARSEOBJECTS列表
试一试{
ConnectivityManager ConnectivityManager=(ConnectivityManager)getSystemService(CONNECTIVITY_服务);
NetworkInfo NetworkInfo=connectivityManager.getActiveNetworkInfo();
if(networkInfo!=null&&networkInfo.isConnected()){
//query.fromLocalDatastore();//所以用户不必等待
query.whereExists(“youtube_id”);
查询设置限制(30);
query.orderByDescending(“updatedAt”);
if(lang.equals(“en”))
查询:whereEqualTo(“语言”、“英语”);
else if(lang.equals(“hi”))
查询:whereEqualTo(“语言”、“hi”);
findInBackground(新的FindCallback(){
public void done(最终列表idList,parsee异常){
如果(e==null){
for(int i=0;i