【问题标题】:AsyncTask return variable cannot be resolvedAsyncTask 返回变量无法解析
【发布时间】:2012-10-22 05:47:25
【问题描述】:

这个 AsyncTask 代码有什么问题,阻止它返回数组进度...我在注释行中得到“进度无法解析为变量”。

public class FetchProgress extends AsyncTask<OpportunityActivity, Void, ArrayList<Progress>> {
private OpportunityActivity opportunityActivity;

@Override
protected ArrayList<Progress> doInBackground(OpportunityActivity... activity) {
    opportunityActivity = activity[0];             
    String readFeed = readFeed();
    // this JSON feed is delivered correctly

    try {       
       JSONObject json = new JSONObject(readFeed);                 
       JSONObject jsonObject = new JSONObject(json.optString("ShowProgress"));

          Progress progress = new Progress();
          progress.setShowProgress(jsonObject.getBoolean("ShowProgress"));
          progress.setTarget(jsonObject.getInt("Target"));

     // the above values are set correctly and appear if I use Log            

    } catch (Exception e) {    
        e.printStackTrace();
    }
   // HERE'S THE ISSUE: 
   // Eclipse reports "progress cannot be resolved to a variable"
   return progress;
}

这是 OnPostExecute:

public void onPostExecute(ArrayList<Progress> progress) {
     opportunityActivity.updateProgress(progress);
}

课程如下:

public class Progress {
private boolean showprogress;
private int target;

public boolean getShowProgress() {
    return showprogress;
}
public void setShowProgress(boolean showprogress) {
    this.showprogress = showprogress;
}

public int getTarget() {
    return target;
}

public void setTarget(int target) {
    this.target = target;
}
}

这是 onPostExecute:

public void onPostExecute(ArrayList<Progress> progress) {
     opportunityActivity.updateProgress(progress);
}

以及它在我无法访问传递的 ArrayList 时触发的方法:

public void updateProgress(ArrayList<Progress> progress) {      
    progress_text  = (TextView)findViewById(R.id.progress_text);          
    progress_text.setText("Target: " + progress.getTarget());
}

【问题讨论】:

标签: android arraylist android-asynctask


【解决方案1】:

剪掉这条线,

 Progress progress = new Progress();

并将其粘贴到 try 语句之外。

ArrayList<Progress> progressArray=new ArrayList();

  Progress progress = new Progress();

try {       
       JSONObject json = new JSONObject(readFeed);                 
       JSONObject jsonObject = new JSONObject(json.optString("ShowProgress"));


          progress.setShowProgress(jsonObject.getBoolean("ShowProgress"));
          progress.setTarget(jsonObject.getInt("Target"));
       progressArray.add(progress);
     // the above values are set correctly and appear if I use Log            

    } catch (Exception e) {    
        e.printStackTrace();
    }
   return progressArray;

由于您已在 try Catch 中声明并初始化它,因此您的方法看不到它。

编辑

但这仍然是错误的,因为它只是您尝试返回的类的对象,而您的方法期望返回类型为 ArrayList 的对象。所以我已经编辑了关于如何返回 ArrayList 的答案。

【讨论】:

  • 如果我将Progress progress = new Progress(); 行移到try 语句之外,那么我的return progress 会收到一个新错误“类型不匹配:无法从Progress 转换为ArrayList”;行。
  • 谢谢 - 现在数组没有被传递到 onPostExecute 和对此起作用的最终方法(请参阅更新的代码)。如何正确传输然后访问传递的数组变量。
  • 编辑点赞ArrayList&lt;Progress&gt; progressArray=new ArrayList&lt;Progress&gt;(); 这表示我仍然无法在我的onPostExecute 方法updateProgress 中访问该数组。任何帮助表示赞赏。
【解决方案2】:

感谢 Andro(他将获得更多声誉)。

我终于使用这个循环访问了数组中的值(这似乎没有必要),但它最终从这个一维数组中取出了元素:

   for (Progress i : progress) 
   progress_text.setText(i.getOrange() + " / " + i.getTarget() + " hours");        
    progressHours.setMax(i.getTarget());
    progressHours.setProgress(i.getOrange());           
    }

我欢迎 cmets 关于是否有必要添加这个第二维度。

【讨论】:

    猜你喜欢
    • 2014-06-17
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    • 2020-01-17
    相关资源
    最近更新 更多