Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.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
Android 在异步任务期间从外部类发布进度?_Android_Android Asynctask - Fatal编程技术网

Android 在异步任务期间从外部类发布进度?

Android 在异步任务期间从外部类发布进度?,android,android-asynctask,Android,Android Asynctask,我有一个带有doInBackground()方法的异步任务,如下所示: protected String doInBackground(String... params) { MyClass session = new MyClass("email", "password"); return session.isAuthorized(); } private class MyClass {

我有一个带有
doInBackground()
方法的异步任务,如下所示:

       protected String doInBackground(String... params) {
          MyClass session = new MyClass("email", "password");
          return session.isAuthorized();
       }
       private class MyClass {
                  // fields, constructors, etc
                  public Boolean isAuthorized() {
                             // some stuff
                             log("Action 1...");
                             // some stuff
                             log("Action 2...");
                             // some other stuff
                             return result;
                  }

                  public static void log(String str) {
                             // HERE I would like to publish progress in the Async Task
                             // but, until now, it's kinda like:
                             System.out.println(str);
                  }
       }
而另一个完全不同的包中的
MyClass
,是这样的:

       protected String doInBackground(String... params) {
          MyClass session = new MyClass("email", "password");
          return session.isAuthorized();
       }
       private class MyClass {
                  // fields, constructors, etc
                  public Boolean isAuthorized() {
                             // some stuff
                             log("Action 1...");
                             // some stuff
                             log("Action 2...");
                             // some other stuff
                             return result;
                  }

                  public static void log(String str) {
                             // HERE I would like to publish progress in the Async Task
                             // but, until now, it's kinda like:
                             System.out.println(str);
                  }
       }
问题是:我如何将
log()
方法中的日志描述传递到
publishProgress()
方法,即使是在主活动“container”之外?我已经阅读了此线程:-但它不是有效的帮助来源,因为我的方法不包含在主类
公共类MainActivity extensed Activity{}

编辑#1-

经过一些工作,我意识到唯一的方法是将“main”线程的引用传递给外部类a,然后在那里实现一个特定的方法来发布进度。以这种方式:

       public void log(String str) {
                  if (mThreadReference==null) {
                             System.out.println(str);
                  } else {
                             mThreadReference.doProgress();
                  }
       }
mThreadReference
指向此
AsyncTask

    private class MyClassTask extends AsyncTask<String,String,String>  {
        @Override
        protected String doInBackground(String... params) {
            // constructs MyClass instance with a reference and run main method
            (new MyClass("email", "password", this)).isAuthorized();
        }

        public void doProgress(String str) {
            publishProgress(str);
        }

        @Override
        protected void onProgressUpdate(String... values) {
            // some stuff
        }
        @Override
        protected void onPostExecute(String result) {
        }
    }

我发现唯一的方法是在主活动中导入AsyncTask的istance,它必须是公共的(不是默认选项!)。通过这个技巧,我可以调用publishProgress方法,即使它受到保护

    // MyClass, in a different package

    import MainActivity.MyClassTask mThreadReference = null;

    // some stuff...

    public void log(String str) {
            if (mThreadReference==null) {
                    System.out.println(str);
            } else {
                    mThreadReference.doProgress("");
            }
    }
虽然这是一项活动:

public class LoginLanding extends Activity {

    // stuff...

    public class MyClassTask extends AsyncTask<String,String,String>  {
            // bla bla bla, some stuff...

            public void doProgress(String str) {
                    // do something
            }
    }
}
公共类登录扩展活动{
//东西。。。
公共类MyClassTask扩展了AsyncTask{
//布拉布拉布拉布拉,一些东西。。。
公共void doProgress(字符串str){
//做点什么
}
}
}

今天我遇到了类似的问题。之前的答案帮助解决了50%的问题。由于mThreadReference为空,因此出现空指针异常

现在需要一个封闭类的实例来实例化内部类AsyncTask类。因为我在片段中定义了这样的类,所以我所做的如下:

    MyFragment fm = new MyFragment();
    MyFragment.AsyncTaskClassName aTCN = fm.new AsyncTaskClassName();
之后,您可以按照Gianlunca的建议调用doProgress方法

我的2美分