Android 在AsyncTask中是否可以重载publishProgress?
我试图在我的后台进程中发布两种不同的进展。我试图在某个时间发布一个字符串,另一个时间发布一个整数。在onProgressUpdate中,我也通过重载来处理这两种参数。但是当我声明AsyncTask类时,我有参数,这就是为什么它希望我只发送字符串类型的参数。是否有一种方法可以处理这两种类型的publishProgress事件?基本上有两种方法可以解决您的问题: 第一个非常简单,您只需始终Android 在AsyncTask中是否可以重载publishProgress?,android,android-asynctask,Android,Android Asynctask,我试图在我的后台进程中发布两种不同的进展。我试图在某个时间发布一个字符串,另一个时间发布一个整数。在onProgressUpdate中,我也通过重载来处理这两种参数。但是当我声明AsyncTask类时,我有参数,这就是为什么它希望我只发送字符串类型的参数。是否有一种方法可以处理这两种类型的publishProgress事件?基本上有两种方法可以解决您的问题: 第一个非常简单,您只需始终publishUpdate(String),然后在onProgressUpdate(String)中检查字符串是
publishUpdate(String)
,然后在onProgressUpdate(String)
中检查字符串是int还是String,并按如下方式处理每种情况:
private class MyAsyncTask extends AsyncTask<Void, String, Void> {
//Executed on main UI thread.
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
try{
Integer i = Integer.parseInt(values[0]);
TextView v1 = (TextView) findViewById(R.id.textView1);
v1.setText(String.valueOf(i));
}
catch(NumberFormatException e){
TextView v2 = (TextView) findViewById(R.id.textView3);
v2.setText(values[0]);
}
}
@Override
protected Void doInBackground(Void... params) {
int i = 0;
while(i < 100){
try {
if(i%2 == 0){
publishProgress("Divisible by 2: " + String.valueOf(i));
}
publishProgress(String.valueOf(i));
i++;
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
}
然后您可以这样覆盖它(注意与仅使用AsyncTask的相似性)
私有类MyDIYAsyncTask扩展了DIYAsyncTask{
//在主UI线程上执行。
@凌驾
受保护的void onIntProgressUpdate(整型…值){
super.onIntProgressUpdate(值);
TextView v=(TextView)findViewById(R.id.textView1);
v、 setText(String.valueOf(值[0]);
}
@凌驾
受保护的无效onStringProgressUpdate(字符串…值){
super.onStringProgressUpdate(值);
TextView v=(TextView)findViewById(R.id.textView3);
v、 setText(值[0]);
}
@凌驾
受保护的Void doInBackground(Void…参数){
int i=0;
而(i<100){
试一试{
出版进度(一);
publishStringProgress(“MyString”+String.valueOf(i));
i++;
睡眠(500);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
返回null;
}
}
使用标准AsyncTask无法做到这一点-您要么使用两种类型都可以符合的类型,要么实现您自己的AsyncTask。我正在我的活动中实现SensorEventListener类,我在其中嵌套了我的AsyncTask类。我是否可以创建一个字符串全局变量并更新AsyncTask中的变量,onSensorChanged()方法将拾取该变量并将其设置为文本?我能完全避免postProgress()方法吗?如果我正确理解你的话,那将是一个非常糟糕的设计策略。最好创建自己的AsyncTask实现,它将支持多个更新方法,这样您就不局限于一个方法。或者,您可以在publishUpdate()方法中始终使用字符串,然后在onProgressUpdate()中检查字符串是否为整数(使用integer.parseInt(您的字符串))如果它能帮助你,我可以给你一个例子,用多种更新方法实现你自己的异步任务。是的,请!!!非常感谢你!
import android.os.Handler;
import android.os.Looper;
public abstract class DIYAsyncTask<Params, IntProgress, StringProgress, Result> {
private Result backGroundResult;
//Run on UI thread
@SuppressWarnings("unchecked")
protected void execute(Params... params){
final Params[] thisParams = params;
Thread worker = new Thread(){
public void run(){
prepareForPreExecute();
backGroundResult = doInBackground(thisParams);
prepareForPostExecute();
}
};
worker.setPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
worker.start();
}
//Code to start onPreExecute on UI thread
private void prepareForPreExecute(){
Handler ui_handler = new Handler(Looper.getMainLooper());
ui_handler.post(
new Runnable(){
public void run(){
onPreExecute();
}
}
);
}
//Code to start onPostExecute on UI thread
private void prepareForPostExecute(){
Handler ui_handler = new Handler(Looper.getMainLooper());
ui_handler.post(
new Runnable(){
public void run(){
onPostExecute(backGroundResult);
}
}
);
}
//Always run on worker thread
@SuppressWarnings("unchecked")
protected abstract Result doInBackground(Params... params);
//Always run on UI
protected void onPreExecute(){
}
//Always run on UI
protected void onPostExecute(Result result){
}
//Run on worker
@SuppressWarnings("unchecked")
protected void publishIntProgress(IntProgress... values){
Handler ui_handler = new Handler(Looper.getMainLooper());
final IntProgress[] thisProgress = values;
ui_handler.post(
new Runnable(){
@Override
public void run(){
onIntProgressUpdate(thisProgress);
}
}
);
}
//Always run on UI
@SuppressWarnings("unchecked")
protected void onIntProgressUpdate(IntProgress... values){
}
//Run on worker
@SuppressWarnings("unchecked")
protected void publishStringProgress(StringProgress... values){
Handler ui_handler = new Handler(Looper.getMainLooper());
final StringProgress[] thisProgress = values;
ui_handler.post(
new Runnable(){
@Override
public void run(){
onStringProgressUpdate(thisProgress);
}
}
);
}
//Always run on UI
@SuppressWarnings("unchecked")
protected void onStringProgressUpdate(StringProgress... values){
}
}
private class MyDIYAsyncTask extends DIYAsyncTask<Void, Integer, String, Void> {
//Executed on main UI thread.
@Override
protected void onIntProgressUpdate(Integer... values) {
super.onIntProgressUpdate(values);
TextView v = (TextView) findViewById(R.id.textView1);
v.setText(String.valueOf(values[0]));
}
@Override
protected void onStringProgressUpdate(String... values) {
super.onStringProgressUpdate(values);
TextView v = (TextView) findViewById(R.id.textView3);
v.setText(values[0]);
}
@Override
protected Void doInBackground(Void... params) {
int i = 0;
while(i < 100){
try {
publishIntProgress(i);
publishStringProgress("MyString" + String.valueOf(i));
i++;
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
}