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美分