Android 在AsyncTask中是否可以重载publishProgress?

Android 在AsyncTask中是否可以重载publishProgress?,android,android-asynctask,Android,Android Asynctask,我试图在我的后台进程中发布两种不同的进展。我试图在某个时间发布一个字符串,另一个时间发布一个整数。在onProgressUpdate中,我也通过重载来处理这两种参数。但是当我声明AsyncTask类时,我有参数,这就是为什么它希望我只发送字符串类型的参数。是否有一种方法可以处理这两种类型的publishProgress事件?基本上有两种方法可以解决您的问题: 第一个非常简单,您只需始终publishUpdate(String),然后在onProgressUpdate(String)中检查字符串是

我试图在我的后台进程中发布两种不同的进展。我试图在某个时间发布一个字符串,另一个时间发布一个整数。在onProgressUpdate中,我也通过重载来处理这两种参数。但是当我声明AsyncTask类时,我有参数,这就是为什么它希望我只发送字符串类型的参数。是否有一种方法可以处理这两种类型的publishProgress事件?

基本上有两种方法可以解决您的问题:

第一个非常简单,您只需始终
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;
    }

}