【发布时间】:2019-09-23 07:06:09
【问题描述】:
我正在尝试创建自己的 android Asynctask 实现。为此,我创建了一个扩展 Thread 类的抽象类。我声明了 onPreExecute、onPostExecute、onProgressUpdate 和 doInBackground 的方法。
我通过从主线程的 Looper 创建一个处理程序来运行 doInBackground 方法。但是我无法在 onProgressUpdate() 方法中修改 UI 元素,但我可以在 onPostExecute() 方法中修改 UI 元素。
这是我尝试过的。
package com.example.myapplication;
import android.os.Handler;
import android.os.Looper;
public abstract class MyAsyncTask extends Thread {
String[] urls;
Handler handler;
abstract protected void onPreExecute();
abstract protected void onPostExecute(String result);
abstract protected void onProgressUpdate(String result);
protected void publishProgress(String progress) {
onProgressUpdate(progress);
}
abstract protected void doInBackground(String... urls);
protected void execute(String... urls) {
onPreExecute();
this.urls = urls;
start();
}
public void run() {
try {
handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
doInBackground(urls);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
这是我的 MainActivity。它有进度条和progressText来显示进度。
package com.example.myapplication;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
ProgressBar bar;
TextView progressText;
LinearLayout container;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bar = findViewById(R.id.progress);
progressText = findViewById(R.id.progressText);
container = findViewById(R.id.container);
}
public void startProcess(View view) {
String[] assignments = {"assgn1", "assgn2", "assgn3", "assgn4", "assgn5"};
new ProgressAsync().execute(assignments);
}
public void showProgress() {
container.setVisibility(View.VISIBLE);
}
public void hideProgress() {
container.setVisibility(View.GONE);
}
public class ProgressAsync extends MyAsyncTask {
@Override
protected void onPreExecute() {
showProgress();
}
@Override
protected void onPostExecute(String result) {
progressText.setText("All processed");
hideProgress();
}
@Override
protected void onProgressUpdate(String result) {
progressText.setText(result + " processed");
}
@Override
protected void doInBackground(String... urls) {
for (int i = 0; i < urls.length; i++) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
publishProgress(this.urls[i]);
}
onPostExecute("SUCCESS");
}
}
}
它应该在每 2 秒后设置 progressText,如 assgn1、assgn2 等。但是它在 onProgressUpdate() 期间没有为 progressText 设置任何文本,而是在 onPostExecute() 方法中设置了“All Processed”。
如果我在这里遗漏了什么,有人可以帮助我吗?
【问题讨论】:
-
你让
MyAsyncTask extends Thread。线程不是 AsyncTask。你需要MyAsyncTask extends AsyncTask<String, String, String> -
@anatoli 我不想创建 AsyncTask 的子类。我想自己实现一个 AsyncTask 版本。
标签: android multithreading android-asynctask handler