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