Java 延迟后调用方法时应用程序崩溃

Java 延迟后调用方法时应用程序崩溃,java,android,android-studio,crash,delay,Java,Android,Android Studio,Crash,Delay,我试图在OnCreate中执行doit()方法,等待5秒钟以允许完全加载该方法的功能,然后在wait函数中调用tester()方法。 应用程序正常运行,没有延迟,并显示“TextView”,这是函数完成前文本框的输出,我想等待5秒钟,直到doit()完成加载,然后在等待后显示tester()中的texx内容。任何帮助都将不胜感激。 下面链接的图片是一个崩溃输出,应用程序正在运行 公共类AppHome扩展AppCompatActivity实现PopupMenu.OnMenuItemClick

我试图在OnCreate中执行doit()方法,等待5秒钟以允许完全加载该方法的功能,然后在wait函数中调用tester()方法。 应用程序正常运行,没有延迟,并显示“TextView”,这是函数完成前文本框的输出,我想等待5秒钟,直到doit()完成加载,然后在等待后显示tester()中的texx内容。任何帮助都将不胜感激。 下面链接的图片是一个崩溃输出,应用程序正在运行


公共类AppHome扩展AppCompatActivity实现PopupMenu.OnMenuItemClickListener{
TextView-texx;
私人ArrayList al;
专用阵列适配器阵列适配器;
私人互联网i;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u app\u home);
新建doit().execute();
Handler=newhandler();
handler.postDelayed(新的Runnable(){
@凌驾
公开募捐{
测试器();
}
}, 5000);
}
公共空间测试器(){
texx=findviewbyd(R.id.text1);
字符串text=texx.getText().toString();
//字符串num=文本;
字符串[]str=text.split(“,”);
final ArrayList al=新的ArrayList(Arrays.asList(str));
arrayAdapter=新的arrayAdapter(this,R.layout.item,R.id.helloText,al);
SwipeFlingDapterView flingContainer=findViewById(R.id.frame);
registerForContextMenu(flingContainer);
flingContainer.setAdapter(阵列适配器);
flingContainer.setFlingListener(新的SwipeFlingAdapterView.onFlingListener(){
@凌驾
public void removeFirstObjectInAdapter(){
//这是从适配器(/AdapterView)中删除对象的最简单方法
Log.d(“列表”,“删除对象!”);
al.移除(0);
arrayAdapter.notifyDataSetChanged();
}
@凌驾
public void onLeftCardExit(对象dataObject){
//在左边做点什么!
//您还可以访问原始对象。
//如果您想使用它,只需强制转换它(字符串)数据对象
Toast.makeText(AppHome.this,“left”,Toast.LENGTH_SHORT.show();
}
@凌驾
RightCardExit上的公共无效(对象dataObject){
Toast.makeText(AppHome.this,“right”,Toast.LENGTH_SHORT.show();
}
@凌驾
dapterabouttoempty上的公共void(int itemsInAdapter){
//在这里询问更多数据
al.add(“XML.concat(String.valueOf(i)));
arrayAdapter.notifyDataSetChanged();
日志d(“列表”、“通知”);
i++;
}
@凌驾
公共无效onScroll(浮动百分比){
}
});
//(可选)添加一个McClickListener
/*
flingContainer.setOnItemClickListener(新的SwipeFlingAdapterView.OnItemClickListener(){
@凌驾
单击公共对象(int itemPosition,Object dataObject){
}
});
*/
}
公共类doit扩展了异步任务{
@凌驾
受保护的字符串背景(无效…无效){
字串=”;
试一试{
Document doc=Jsoup.connect(“https://screenscrape4top40.000webhostapp.com/).get();
words=doc.text();
}捕获(例外e){
e、 printStackTrace();
}
返回单词;
}
@凌驾
public void onPostExecute(字符串字){
super.onPostExecute(字);
texx.setText(字);
}
}
公共无效显示弹出窗口(视图v){
PopupMenu popup=新的PopupMenu(此,v);
popup.setOnMenuItemClickListener(这个);
弹出.充气(右菜单.下拉菜单1);
popup.show();
}
@凌驾
公共布尔onMenuItemClick(菜单项){
开关(item.getItemId()){
案例R.id.1:
Toast.makeText(此“单击项目1”,Toast.LENGTH_SHORT.show();
返回true;
案例R.id.2:
Toast.makeText(此“单击项目2”,Toast.LENGTH_SHORT.show();
返回true;
案例R.id.3:
Toast.makeText(此“单击项目3”,Toast.LENGTH_SHORT).show();
返回true;
案例R.id.4:
Toast.makeText(此“单击项目4”,Toast.LENGTH_SHORT.show();
返回true;
违约:
返回false;
}
}
}

将onCreate()中的以下行移到setContentView()之后:


仅在5秒后设置变量
texx
。线程在此之前完成,因此此时
texx
为空。我建议两件事,首先将AsyncTask移到它自己的类文件中(或使类保持静态)。否则,您将泄漏
上下文。另外。有一些更好的解决方案可以处理并发性。科特林有共同计划。Java和Kotlin拥有RxJava。例如,这是正确的。另外,一个好的解决方案是将
tester()
调用移出处理程序,并将其放入onPostExecute。如果通话时间为6秒,则fo

public class AppHome extends AppCompatActivity implements PopupMenu.OnMenuItemClickListener {
    TextView texx;
    private ArrayList<String> al;
    private ArrayAdapter<String> arrayAdapter;
    private int i;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_app_home);

        new doit().execute();

        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
           tester();
            }
        }, 5000);
    }
        public void tester() {
            texx = findViewById(R.id.text1);
            String text = texx.getText().toString();

            //String num = text;
            String[] str = text.split(",");
            final ArrayList al = new ArrayList<String>(Arrays.asList(str));

            arrayAdapter = new ArrayAdapter<>(this, R.layout.item, R.id.helloText, al);

            SwipeFlingAdapterView flingContainer = findViewById(R.id.frame);


            registerForContextMenu(flingContainer);


            flingContainer.setAdapter(arrayAdapter);

            flingContainer.setFlingListener(new SwipeFlingAdapterView.onFlingListener() {
                @Override
                public void removeFirstObjectInAdapter() {
                    // this is the simplest way to delete an object from the Adapter (/AdapterView)
                    Log.d("LIST", "removed object!");
                    al.remove(0);
                    arrayAdapter.notifyDataSetChanged();
                }

                @Override
                public void onLeftCardExit(Object dataObject) {
                    //Do something on the left!
                    //You also have access to the original object.
                    //If you want to use it just cast it (String) dataObject
                    Toast.makeText(AppHome.this, "left", Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onRightCardExit(Object dataObject) {
                    Toast.makeText(AppHome.this, "right", Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onAdapterAboutToEmpty(int itemsInAdapter) {
                    // Ask for more data here
                    al.add("XML ".concat(String.valueOf(i)));
                    arrayAdapter.notifyDataSetChanged();
                    Log.d("LIST", "notified");
                    i++;
                }

                @Override
                public void onScroll(float scrollProgressPercent) {
                }
            });

            // Optionally add an OnItemClickListener
        /*
        flingContainer.setOnItemClickListener(new SwipeFlingAdapterView.OnItemClickListener() {
            @Override
            public void onItemClicked(int itemPosition, Object dataObject) {

            }
        });

         */

        }

        public class doit extends AsyncTask<Void, Void, String> {
            @Override
            protected String doInBackground(Void... voids) {
                String words = "";
                try {
                    Document doc = Jsoup.connect("https://screenscrape4top40.000webhostapp.com/").get();
                    words = doc.text();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return words;
            }

            @Override
            public void onPostExecute(String words) {
                super.onPostExecute(words);
                texx.setText(words);

            }
        }


        public void showPopup (View v){
            PopupMenu popup = new PopupMenu(this, v);
            popup.setOnMenuItemClickListener(this);
            popup.inflate(R.menu.dropdown_menu1);
            popup.show();
        }

        @Override
        public boolean onMenuItemClick (MenuItem item){
            switch (item.getItemId()) {
                case R.id.item1:
                    Toast.makeText(this, "Item 1 clicked", Toast.LENGTH_SHORT).show();
                    return true;
                case R.id.item2:
                    Toast.makeText(this, "Item 2 clicked", Toast.LENGTH_SHORT).show();
                    return true;
                case R.id.item3:
                    Toast.makeText(this, "Item 3 clicked", Toast.LENGTH_SHORT).show();
                    return true;
                case R.id.item4:
                    Toast.makeText(this, "Item 4 clicked", Toast.LENGTH_SHORT).show();
                    return true;
                default:
                    return false;
            }
        }
    }



texx = findViewById(R.id.text1);