使用ProgressDialog的外部AsyncTask类【更新:并返回?】

4
**更新:(见下文)**我已经寻找了几天,但无法得到明确的答案。有些人说这是可能的,有些人说可以实现,有些人则说不行。我对此感到非常困惑。
我想要的只是将AsyncTaskTask在外部类中显示进度条。为此,我正在像主类中所示传递上下文。但无论我尝试什么,都会出现NullPointerException
欢迎提供可工作的代码示例。谢谢!
顺便说一句,我正在使用Android 2.2。
主要代码:
import android.app.Activity;
import android.os.Bundle;

public class AsyncDemo extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        new AsyncClass(this).execute();
    }
}

AsyncClass.java

import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.os.SystemClock;

public class AsyncClass extends AsyncTask<Void, String, Void> {
    private Context context;
    ProgressDialog dialog = new ProgressDialog(context);

    public AsyncClass(Context cxt) {
        context = cxt;
    }

    @Override
    protected void onPreExecute() {
        dialog.setTitle("Please wait");
        dialog.show();
    }

    @Override
    protected Void doInBackground(Void... unused) {
        SystemClock.sleep(2000);
        return (null);
    }

    @Override
    protected void onPostExecute(Void unused) {
        dialog.dismiss();
    }
}

更新: 我有一个后续问题:使用上述代码,是否可能从onPostExecute方法返回一个值到主类中呢?(对于我的新手行为感到抱歉) 我尝试了以下代码:

String result = new AsyncClass(this).execute();

然后是一个返回字符串的方法。但我无法做到这一点,因为我遇到了以下问题:

Type mismatch: cannot convert from AsyncTask<String,Void,Void> to String

我该怎么解决这个问题?谢谢。


我对你的后续问题很感兴趣。我有一个类似的情况,但我不确定如何获取返回值。目前我的做法是创建一个“字段变量”,然后在“onPostExecute”中将结果赋值给它,但我不确定这是否是正确的方法。 - Eugene van der Merwe
3个回答

13

你正在使用空上下文创建ProgressDialog。以下代码适用于我:

public class AsyncClass extends AsyncTask<Void, String, Void> {
    private Context context;
    ProgressDialog dialog;

        public AsyncClass(Context cxt) {
            context = cxt;
            dialog = new ProgressDialog(context);
        }

        @Override
        protected void onPreExecute() {
            dialog.setTitle("Please wait");
            dialog.show();
        }

        @Override
        protected Void doInBackground(Void... unused) {
            SystemClock.sleep(2000);
            return (null);
        }

        @Override
        protected void onPostExecute(Void unused) {
            dialog.dismiss();
        }
    }

2
问题在于ProcessDialog在构造函数调用之前被实例化。因此,上下文为空。将ProcessDialog的实例化移动到构造函数中,如下所示,可以确保上下文保存传递给cxt的值。此外,在此示例中,您不需要将上下文存储为字段。只需将cxt传递给ProgressDialog构造函数(即dialog = new ProgressDialog(cxt))。 - Emil L

3

好的,我做的是在使用片段时的操作。这是如何在片段中调用AsyncTask:

String result=new AsyncClass(getActivity()).execute();

这是我的AsyncTask外部类的样子:

public class AsyncClass extends AsyncTask<Void, Void, String> {

    ProgressDialog pdialog;

    public AsyncClass(Context context) {
        pdialog = new ProgressDialog(context);
    }

    @Override
    protected void onPreExecute() {
        pdialog.setIndeterminate(true);
        pdialog.setCancelable(false);
        pdialog.setTitle("Loading Feed..");
        pdialog.setMessage("Please wait.");pdialog.show();
    }

    @Override
    protected String doInBackground(Void... params) {
        String result=null;
        //do your task here and generate result String
        return result;
    }

    @Override
    protected void onPostExecute(String result) {
        if(pdialog.isShowing())
             pdialog.dismiss();
    }
}

@SSZero 谢谢你的好回答,对我很有帮助。


1
我希望回答下一个问题,即:

我有一个跟进的问题:使用上面的代码,是否可以从onPostExecute方法返回一个值到主类中呢?(抱歉,我很菜)我尝试过像这样的东西:

String result = new AsyncClass(this).execute();

我在我的代码中做到了这一点,它起作用了。

AsyncClass ac=new AsyncClass();
                    
ac.execute("");

String rslt=ac.get();

在任何你想要的地方调用这段代码。

public class AsynchClass extends AsyncTask <String,Integer,String>
{

    public String result=null;


    @Override
    protected void onPreExecute() {
    // TODO Auto-generated method stub  
     
    }

    protected String doInBackground(String... params) 
    {

            // Do all your background task here

            return result;
                    
    }
    @Override
     
    protected void onProgressUpdate(Integer... values) {
    
      
    }

    protected void onPostExecute(String result) {
    
    }
}

                
             

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接