0

配列の進行状況を返すことを妨げるこの 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());
}
4

2 に答える 2

2

この線を切って、

 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 を返す方法についての回答を編集しました。

于 2012-10-22T05:50:21.380 に答える
0

Andro に感謝します (評判が上がるでしょう)。

私は最終的にこのループを使用して配列内の値にアクセスしましたが (これは不必要に思えます)、最終的にこの 1 次元配列から要素を取得しました。

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

この 2 番目のディメンションを追加する必要があるかどうかについてのコメントを歓迎します。

于 2012-10-22T06:45:18.987 に答える