Java 内部类可以访问但不能更新值-AsyncTask

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; /

我正在尝试使用Android的AsyncTask解压文件夹。名为Decompress的类是解压的内部类,其中解压本身是非活动类。伪代码是:

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