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

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

我正在尝试用Android的AsyncTask..类(称为解压缩)是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();
        }

我所面临的问题:
1.的价值unzipDestindex,更新到doInBackground,保持空到Unzip以及它所有的目标。如何确保这些值保持更新?
2.我知道doInBackplace发生在一个与主UI线程分离的线程中。这是否意味着,一旦线程返回,新线程中更新的任何值都将丢失吗?


MMTTMM
浏览 443回答 3
3回答

慕仙森

如何确保这些值保持更新?它们将被更新,因为它们是成员变量。然而,因为AsyncTask是异步的,当您检查它们时,它们可能还没有被更新。您可以使用interface若要在更新这些值时创建回调,请执行以下操作。这个答案涵盖了如何做到这一点。这是否意味着,一旦线程返回,新线程中更新的任何值都将丢失吗?不,他们不应该“迷路”。他们可能只是没有改变AsyncTask当你检查他们的时候。由于这不是您的实际代码,所以当您试图访问它们时,我看不到,但是您可以使用interface方法中需要这些值的函数。onPostExecute()..你也可以做一个null在尝试访问之前检查一下。这取决于您所需要的功能和流程,而哪种方式是最好的。希望能帮上忙。编辑在我链接到的答案中,你告诉Activity你会用这个interface并用以下方法覆盖它的方法:implements AsyncResponse在你的Activity在创建单独的interface classpublic&nbsp;class&nbsp;MainActivity&nbsp;implements&nbsp;AsyncResponse{然后,在你的Activity尽管如此,您仍然重写了在该类中声明的方法(void processFinish(String output);)@Override &nbsp;void&nbsp;processFinish(String&nbsp;output){&nbsp;&nbsp;//&nbsp;using&nbsp;same&nbsp;params&nbsp;as&nbsp;onPostExecute() &nbsp;//this&nbsp;you&nbsp;will&nbsp;received&nbsp;result&nbsp;fired&nbsp;from&nbsp;async&nbsp;class&nbsp;of&nbsp;onPostExecute(result)&nbsp;method. &nbsp;&nbsp;&nbsp;}然后调用这个onPostExecute()当侦听器看到它已经完成时delegate.processFinish(result);delegate是AsyncResponse(您的接口类)&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;class&nbsp;AasyncTask&nbsp;extends&nbsp;AsyncTask{public&nbsp;AsyncResponse&nbsp;delegate=null; &nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;protected&nbsp;void&nbsp;onPostExecute(String&nbsp;result)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delegate.processFinish(result); &nbsp;&nbsp;&nbsp;}Interface从上面的链接答案中摘取的例子,并为清晰起见调整/评论。所以,如果这个答案对任何人都有帮助的话,一定要把它提出来。

大话西游666

我希望能够访问其url存储在其中的文件。index在成功完成解压缩操作之后,workThread.execute()..在你提到的问题中,我不明白界面是怎么回事AsyncResponse被初始化了。你能解释一下吗?谢谢
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java
Android