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();
    }
}

异步类.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

我能做些什么来解决这个问题?谢谢。

4

3 回答 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();
        }
    }
于 2010-07-27T19:55:20.150 回答
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谢谢很好的回答,帮了大忙

于 2014-01-29T07:50:18.813 回答
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) {
    
    }
}

                
             
于 2013-03-03T07:02:41.733 回答