为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

MMTTMM 2019-06-19 14:53:02
内部类可以访问但不能更新值-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.的价值unzipDest和index,更新到doInBackground,保持空到Unzip以及它所有的目标。如何确保这些值保持更新?2.我知道doInBackplace发生在一个与主UI线程分离的线程中。这是否意味着,一旦线程返回,新线程中更新的任何值都将丢失吗?
查看完整描述

3 回答

?
慕仙森

TA贡献1827条经验 获得超7个赞

如何确保这些值保持更新?

它们将被更新,因为它们是成员变量。然而,因为AsyncTask是异步的,当您检查它们时,它们可能还没有被更新。您可以使用interface若要在更新这些值时创建回调,请执行以下操作。这个答案涵盖了如何做到这一点。

这是否意味着,一旦线程返回,新线程中更新的任何值都将丢失吗?

不,他们不应该“迷路”。他们可能只是没有改变AsyncTask当你检查他们的时候。

由于这不是您的实际代码,所以当您试图访问它们时,我看不到,但是您可以使用interface方法中需要这些值的函数。onPostExecute()..你也可以做一个null在尝试访问之前检查一下。这取决于您所需要的功能和流程,而哪种方式是最好的。希望能帮上忙。

编辑

在我链接到的答案中,你告诉Activity你会用这个interface并用以下方法覆盖它的方法:implements AsyncResponse在你的Activity在创建单独的interface class

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.
   }

然后调用这个onPostExecute()当侦听器看到它已经完成时delegate.processFinish(result);delegateAsyncResponse(您的接口类)

    public class AasyncTask extends AsyncTask{public AsyncResponse delegate=null;

   @Override
   protected void onPostExecute(String result) {
      delegate.processFinish(result);
   }

Interface从上面的链接答案中摘取的例子,并为清晰起见调整/评论。所以,如果这个答案对任何人都有帮助的话,一定要把它提出来。


查看完整回答
反对 回复 2019-06-19
?
大话西游666

TA贡献1817条经验 获得超14个赞

我希望能够访问其url存储在其中的文件。index在成功完成解压缩操作之后,workThread.execute()..在你提到的问题中,我不明白界面是怎么回事AsyncResponse被初始化了。你能解释一下吗?谢谢

查看完整回答
反对 回复 2019-06-19
  • 3 回答
  • 0 关注
  • 411 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信