Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有ProgressDialog[更新:并返回?]的外部异步任务类_Java_Android_Android Asynctask_Progressdialog - Fatal编程技术网

Java 带有ProgressDialog[更新:并返回?]的外部异步任务类

Java 带有ProgressDialog[更新:并返回?]的外部异步任务类,java,android,android-asynctask,progressdialog,Java,Android,Android Asynctask,Progressdialog,**更新:(见下文)**我已经四处寻找了几天,找不到直接的答案。 有人说这是可能的,也有人说这是不可能的。我快疯了 我想要的只是让AsyncTaskTask显示一个progressbar和一个外部类。要做到这一点,我要传递上下文,正如您在主类中看到的那样。但无论我尝试什么,我都会得到NullPointerException 欢迎使用工作代码示例。多谢各位 顺便说一下,使用安卓2.2 主要内容: AsyncClass.java import android.app.ProgressDialog;

**更新:(见下文)**我已经四处寻找了几天,找不到直接的答案。 有人说这是可能的,也有人说这是不可能的。我快疯了

我想要的只是让AsyncTaskTask显示一个progressbar和一个外部类。要做到这一点,我要传递上下文,正如您在主类中看到的那样。但无论我尝试什么,我都会得到
NullPointerException

欢迎使用工作代码示例。多谢各位

顺便说一下,使用安卓2.2

主要内容:

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();
    }
}
然后是返回字符串的方法。但我不能这么做,因为我有:

Type mismatch: cannot convert from AsyncTask<String,Void,Void> to String
类型不匹配:无法从AsyncTask转换为字符串

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

您正在创建带有空上下文的
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();
        }
    }
公共类AsyncClass扩展了AsyncTask{
私人语境;
进程对话;
公共异步类(上下文cxt){
上下文=cxt;
dialog=新建进度对话框(上下文);
}
@凌驾
受保护的void onPreExecute(){
dialog.setTitle(“请稍候”);
dialog.show();
}
@凌驾
受保护的空位背景(空位…未使用){
SystemClock.sleep(2000年);
返回(空);
}
@凌驾
受保护的void onPostExecute(未使用的void){
dialog.dismise();
}
}

我想回答后续问题,即

我有一个后续问题:使用上面的代码,是否有可能以某种方式将onPostExecute方法中的值返回给主类?(对不起,比比诺比什)我试过这样的方法:

String result = new AsyncClass(this).execute();
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) {
    
    }
}

                
             
公共类AsynchClass扩展了AsyncTask
{
公共字符串结果=null;
@凌驾
受保护的void onPreExecute(){
//TODO自动生成的方法存根
}
受保护的字符串doInBackground(字符串…参数)
{
//在这里完成所有背景任务
返回结果;
}
@凌驾
受保护的void onProgressUpdate(整型…值){
}
受保护的void onPostExecute(字符串结果){
}
}

好的,这就是我在使用片段时所做的。以下是在片段中调用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();
    }
}
公共类AsyncClass扩展了AsyncTask{
ProgressDialog;
公共异步类(上下文){
pdialog=新建进度对话框(上下文);
}
@凌驾
受保护的void onPreExecute(){
pdialog.setUndeterminate(真);
pdialog.setCancelable(假);
pdialog.setTitle(“加载提要”);
pdialog.setMessage(“请稍候”);pdialog.show();
}
@凌驾
受保护字符串doInBackground(无效…参数){
字符串结果=null;
//在此处执行任务并生成结果字符串
返回结果;
}
@凌驾
受保护的void onPostExecute(字符串结果){
if(pdialog.isShowing())
pdialog.disclose();
}
}

@非常感谢您的回答,帮助很大。

问题是ProcessDialog是在调用构造函数之前实例化的。因此,上下文是空的。像这样将ProcessDialog的实例化移动到构造函数中可以确保上下文保存在cxt中传递的值。此外,在本示例中,您实际上不需要将上下文存储为字段。只需将cxt传递给ProgressDialog构造函数(即dialog=new ProgressDialog(cxt))。我对您的后续问题感兴趣。我有一个类似的情况,我不知道如何得到返回值回来。我目前正在做的是创建一个
字段变量
,然后在
onPostExecute
中分配结果,但我不确定这是否正确。
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();
    }
}