内部类可以访问但不更新值 – AsyncTask

我正在尝试使用Android的AsyncTask解压缩文件夹。 这个类(称为Decompress)是Unzip一个内部类,Unzip本身是一个非活动类。 伪代码是:

 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更新的unzipDestindex值在Unzip及其所有对象中保留为空。 我怎样才能确保值保持更新?
2.我知道doInBackground发生在与主UI线程分离的线程中。 这是否意味着一旦该线程返回,新线程中更新的值将会丢失?

我怎样才能确保值保持更新?

他们将被更新,因为他们是成员variables。 但是,由于AsyncTask是asynchronous的,所以在检查它们时可能不会更新。 当这些值更新时,您可以使用一个interface来创buildcallback。 这个答案涵盖了如何做到这一点

这是否意味着一旦该线程返回,新线程中更新的值将会丢失?

不,他们不应该“失去”。 当你检查它们时,它们可能只是在AsyncTask没有改变。

因为这不是你实际的代码,所以当你试图访问它们的时候我看不到,但是你可以使用interface方法或者在onPostExecute()调用需要这些值的函数。 在尝试访问它们之前,你也可以做一个null检查。 这取决于你需要的function和stream程,哪个是最好的方法。 希望有所帮助。

编辑

在我链接的答案中,在创build单独的interface class之后,您告诉Activity将使用该interface并在您的Activity声明中使用implements AsyncResponse覆盖其方法

 public class MainActivity implements AsyncResponse{ 

然后,在你的Activity仍然重写你在那个类中声明的方法( void processFinish(String output);

 @Override void processFinish(String output){ // using same params as onPostExecute() //this you will received result fired from async class of onPostExecute(result) method. } 

那么当监听器发现它是用delegate.processFinish(result);完成时,在onPostExecute()调用它delegate.processFinish(result); delegateAsyncResponse一个实例(你的接口类)

  public class AasyncTask extends AsyncTask{ public AsyncResponse delegate=null; @Override protected void onPostExecute(String result) { delegate.processFinish(result); } 

从上面链接的答案中获取的Interface示例,并为了清晰起见而进行了调整/评论 所以一定要upvote这个答案,如果它可以帮助任何人。