Java 在android中使用线程应用UI更改

Java 在android中使用线程应用UI更改,java,android,android-layout,Java,Android,Android Layout,我遇到了一个问题,需要一些帮助。我想删除一些用户的文件后,一个按钮点击,并显示文件删除进度(在progressbar),并显示一些奇特的用户界面。首先,我改变了布局后,按钮点击和隐藏一些元素和其他可见。之后,我调用了方法来删除文件。问题是,在删除所有用户文件之前,我看不到任何UI更改和系统挂起,然后根据我的场景将其转到另一个活动。我在谷歌上搜索过,发现我应该使用thread或UI thread,但我确实不知道如何使用。这是我的密码: new Thread() { public void

我遇到了一个问题,需要一些帮助。我想删除一些用户的文件后,一个按钮点击,并显示文件删除进度(在progressbar),并显示一些奇特的用户界面。首先,我改变了布局后,按钮点击和隐藏一些元素和其他可见。之后,我调用了方法来删除文件。问题是,在删除所有用户文件之前,我看不到任何UI更改和系统挂起,然后根据我的场景将其转到另一个活动。我在谷歌上搜索过,发现我应该使用thread或UI thread,但我确实不知道如何使用。这是我的密码:

new Thread() {
    public void run() {
        try {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    ProgressBar spinner;
                    spinner = (ProgressBar) findViewById(R.id.progressBar);
                    listview.setVisibility(View.GONE);
                    spinner.setVisibility(View.VISIBLE);
                    preresult.setVisibility(View.VISIBLE);
                    resulttxt.setVisibility(View.VISIBLE);
                    wv.setVisibility(View.VISIBLE);
                    btnClear.setVisibility(View.GONE);
                    wv.loadUrl("file:///android_asset/rocket.gif");
                    resulttxt.setText("");
                }
            });
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}.start();

Thread b = new Thread() {
    @Override
    public void run() {
        Long TotalJunk = 0L;
        for (Apps social : checkedSocial) {
            if (social.getName() == "Telegram") {
                preresult.setText("Calculating Files :");
                resulttxt.setText("Telegram");
                preresult.setText("Removing Files...");
                clearMediashistory(social.path);
                TotalJunk = TotalJunk + social.junksize;
            }
                                           }
        SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        SharedPreferences.Editor editor = pref.edit();
        editor.putString("FreeUp", formatSize(TotalJunk));
        //commits your edits
        editor.commit();
    }
};
b.start();
我的代码有什么问题。有更好的方法吗?

试试看

new AsyncTask<String, String, String> () {

    @Override
    protected void onPreExecute() {
        //show loader if requried
    }

    @Override
    protected String doInBackground(String... params) {

        Long TotalJunk = 0L;
        for (Apps social : checkedSocial) {
            if (social.getName() == "Telegram") {
                preresult.setText("Calculating Files :");
                resulttxt.setText("Telegram");
                preresult.setText("Removing Files...");
                clearMediashistory(social.path);
                TotalJunk = TotalJunk + social.junksize;
            }
        }
        SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        SharedPreferences.Editor editor = pref.edit();
        editor.putString("FreeUp", formatSize(TotalJunk));
        //commits your edits
        editor.commit();
    }

    @Override
    protected void onPostExecute(String result){

        ProgressBar spinner;
        spinner = (ProgressBar) findViewById(R.id.progressBar);
        listview.setVisibility(View.GONE);
        spinner.setVisibility(View.VISIBLE);
        preresult.setVisibility(View.VISIBLE);
        resulttxt.setVisibility(View.VISIBLE);
        wv.setVisibility(View.VISIBLE);
        btnClear.setVisibility(View.GONE);
        wv.loadUrl("file:///android_asset/rocket.gif");
        resulttxt.setText("");
    }

}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTER);
新建异步任务(){
@凌驾
受保护的void onPreExecute(){
//显示加载程序(如果需要)
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
长总垃圾=0升;
适用于(社交应用程序:checkedSocial){
if(social.getName()=“电报”){
setText(“计算文件:”);
resultText.setText(“电报”);
setText(“删除文件…”);
clearMediashistory(社会路径);
TotalJunk=TotalJunk+social.junksize;
}
}
SharedReferences pref=PreferenceManager.GetDefaultSharedReferences(getApplicationContext());
SharedReferences.Editor=pref.edit();
putString(“FreeUp”,formatSize(TotalJunk));
//提交您的编辑
commit();
}
@凌驾
受保护的void onPostExecute(字符串结果){
ProgressBar旋转器;
微调器=(ProgressBar)findViewById(R.id.ProgressBar);
setVisibility(View.GONE);
spinner.setVisibility(View.VISIBLE);
preresult.setVisibility(View.VISIBLE);
resultText.setVisibility(View.VISIBLE);
wv.setVisibility(视图可见);
btnClear.setVisibility(View.GONE);
wv.loadUrl(“file:///android_asset/rocket.gif");
resultText.setText(“”);
}
}.executeOnExecutor(异步任务.THREAD\u POOL\u EXECUTER);

使用AsyncTask而不是线程


您应该使用AsyncTask而不是普通线程。AsyncTask可以正确、轻松地使用UI线程。此类允许您在UI线程上执行后台操作和发布结果,而无需操作线程和/或处理程序。请检查上述链接。谢谢@Pehlaj,但我的代码中有一些错误。new AsyncTask()为我提供了从AsyncTask派生的匿名类,该类必须是declare abstract或实现抽象方法'DoinBackground(params…)。这是什么错误?我玩弄了你的代码,它就像一个符咒。感谢man.AsyncTask,第一个Void定义doInBackground的参数类型,第二个Void表示doInBackground方法的返回类型,第三个Void作为onpostExecute的输入在您的情况下,Void将替换为String,因为这三个方法都接受/返回字符串类型。我已经更新了答案。谢谢