内部类可以访问但不更新值 – 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
更新的unzipDest
和index
值在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);
delegate
是AsyncResponse
一个实例(你的接口类)
public class AasyncTask extends AsyncTask{ public AsyncResponse delegate=null; @Override protected void onPostExecute(String result) { delegate.processFinish(result); }
从上面链接的答案中获取的Interface
示例,并为了清晰起见而进行了调整/评论 所以一定要upvote这个答案,如果它可以帮助任何人。