带有ProgressDialog的外部AsyncTask类[更新:并返回?]

dro*_*ren 4 java android progressdialog android-asynctask

**更新:(见下文)**我一直在寻找几天,但无法找到答案.有人说有可能有人说完成一些说它不是.我对此感到疯狂.

我想要的只是让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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

更新: 我有一个跟进问题:使用上面的代码,是否有可能从onPostExecute方法返回一个值回到主类,不知何故?(对不起,因为我正在尝试这样的事情:

String result = new AsyncClass(this).execute();
Run Code Online (Sandbox Code Playgroud)

然后是一个返回字符串的方法.但我做不到,因为我得到了:

Type mismatch: cannot convert from AsyncTask<String,Void,Void> to String
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能解决这个问题?谢谢.

SSZ*_*ero 13

您正在ProgressDialog使用null上下文创建.以下代码对我有用.

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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 问题是在调用构造函数之前实例化ProcessDialog.因此上下文为空.将ProcessDialog的实例化移动到这样的构造函数中可确保上下文保存在cxt中传递的值.此外,您不需要将上下文存储为此示例中的字段.只需将cxt传递给ProgressDialog构造函数(即dialog = new ProgressDialog(cxt)). (2认同)