Java 内部类可以访问但不能更新值-AsyncTask
我正在尝试使用Android的AsyncTask解压文件夹。名为Decompress的类是解压的内部类,其中解压本身是非活动类。伪代码是:Java 内部类可以访问但不能更新值-AsyncTask,java,android,multithreading,android-asynctask,Java,Android,Multithreading,Android Asynctask,我正在尝试使用Android的AsyncTask解压文件夹。名为Decompress的类是解压的内部类,其中解压本身是非活动类。伪代码是: public class Unzip { private String index; private String unzipDest; //destination file for storing folder. private Activity activity; private boolean result; /
public class Unzip {
private String index;
private String unzipDest; //destination file for storing folder.
private Activity activity;
private boolean result; //result of decompress.
public void unzip(String loc) {
Decompress workThread = new Decompress(loc, activity);
workThread.execute();
if(unzip operation was successful) {
display(index);
}
//Class Decompress:
class Decompress extends AsyncTask<Void, Integer, Boolean> {
private ProgressDialog pd = null;
private Context mContext;
private String loc;
private int nEntries;
private int entriesUnzipped;
public Decompress(String location, Context c) {
loc = location;
mContext = c;
nEntries = 0;
entriesUnzipped = 0;
Log.v(this.toString(), "Exiting decompress constructor.");
}
@Override
protected void onPreExecute() {
Log.v(this.toString(), "Inside onPreExecute.");
pd = new ProgressDialog(mContext);
pd.setTitle("Unzipping folder.");
pd.setMessage("Unzip in progress.");
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
Log.v(this.toString(), "Showing dialog and exiting.");
pd.show();
}
@Override
protected Boolean doInBackground(Void... params) {
//unzip operation goes here.
unzipDest = something; //unzip destination is set here.
if(unzip operation is successful) {
result = true;
index = url pointing to location of unzipped folder.
} else {
result = false;
}
}
@Override
protected void onPostExecute(Boolean result) {
if(result) {
if(pd != null) {
pd.setTitle("Success");
pd.setMessage("folder is now ready for use.");
pd.show();
pd.dismiss();
pd = null;
Log.v(this.toString(), "Unzipped.");
index = unzipDest + "/someURL";
Log.v(this.toString(), "index present in: " + index);
}
} else {
pd = ProgressDialog.show(mContext, "Failure", "Cannot unzip.");
pd.dismiss();
}
}
}
我面临的问题:
1.在doInBackground中更新的unzipDest和index的值对于Unzip及其所有对象保持为null。如何确保值保持更新?
2.我知道doInBackground发生在与主UI线程分离的线程中。这是否意味着新线程中更新的任何值都将在该线程返回后丢失
如何确保值保持更新
它们将被更新,因为它们是成员变量。但是,由于AsyncTask是异步的,所以在检查它们时,它们可能尚未更新。更新这些值时,可以使用接口创建回调
这是否意味着新线程中更新的任何值都将在该线程返回后丢失
不,他们不应该迷路。当您检查它们时,它们可能只是在AsyncTask中没有被更改
由于这不是您的实际代码,我无法看到您何时尝试访问它们,但您可以使用接口方法或在onPostExecute中调用需要这些值的函数。您还可以在尝试访问它们之前执行空检查。这取决于你需要的功能和流程,哪种方式是最好的。希望有帮助
编辑
在我链接到的答案中,您告诉活动您将使用该接口,并在创建单独的接口类后在活动声明中使用implements AsyncResponse重写其方法
public class AasyncTask extends AsyncTask{
public AsyncResponse delegate=null;
@Override
protected void onPostExecute(String result) {
delegate.processFinish(result);
}
然后,在Activity still中,重写在该类void processFinishString输出中声明的方法
然后,当侦听器看到已使用delegate.processFinishresult完成此操作时,在onPostExecute中调用它;委托是接口类的AsyncResponse实例
public class AasyncTask extends AsyncTask{
public AsyncResponse delegate=null;
@Override
protected void onPostExecute(String result) {
delegate.processFinish(result);
}
接口示例取自上面的链接答案,并为清晰起见进行了调整/注释。所以,如果这个答案对任何人都有帮助的话,一定要投票支持它。答案不错。OP-一般来说,您可能需要阅读java标准中嵌套类的规则和类型:@codeMagic:谢谢您的回复。在workThread.execute中成功完成解压缩操作后,我希望能够访问其url存储在索引中的文件。在您链接到的问题中,我不理解接口AsyncResponse是如何初始化的。你能解释一下吗?谢谢。@Sriram我已经编辑过了。我希望这能让事情明朗一点。请试一试,当你卡住的时候问一下。@codeMagic:我如何初始化委托?在上面的代码段中为空。我还对这个问题做了进一步的编辑。如果解压缩成功,我需要访问解压缩文件夹中的文件。但是,因为解压是由AsyncTask实现的,所以workThread.execute之后的行甚至在解压之前就被执行,从而导致NullException。我需要在解压操作进行时暂停UI。那么AsyncTask是该作业的最佳候选任务,还是我应该在另一个活动中执行解压?您可以看到从url初始化委托
public class AasyncTask extends AsyncTask{
public AsyncResponse delegate=null;
@Override
protected void onPostExecute(String result) {
delegate.processFinish(result);
}