2016-02-11 71 views
0

我很努力讓一個對象從void函數正確地轉移到for循環,以便它可以迭代到Android工作室的線性佈局。有人能夠概述如何做到這一點,以及背後的邏輯。在Java中的範圍,當用於void然後for循環

Backendless.Persistence.of(Tasks.class).find(
      new AsyncCallback<BackendlessCollection<Tasks>>() { 

       @Override 
       public void handleResponse(BackendlessCollection<Tasks> tc) { 
        List<Tasks> tasks = tc.getData(); 
        Log.d("ToDo", "Retrieved " + tasks.size() + " tasks"); 
       } 

       @Override 
       public void handleFault(BackendlessFault e) { 
        Log.d("ToDo", "Error: " + e.getMessage()); 
       } 
      }); 

    LinearLayout taskList = (LinearLayout) findViewById(R.id.taskList); 

    //repeat for each task in list of tasks 
    for (Tasks task :tasks) { 

     //retrieve task text form object and log it 
     String taskText = task.getTask(); 
     Log.d("ToDo", taskText); 

     //create new text view and set task text 
     TextView textView = new TextView(getApplicationContext()); 
     textView.setText(taskText); 

     //add text view to linear layout 
     taskList.addView(textView); 

    } 
+1

從什麼樣子,'tasks'甚至不打算通過你達到你的'for'循環的時間來計算。異步回調的重點在於將來會調用該回調函數,而您無法控制它。 –

+0

嘗試使用接口在此進行通信。在異步任務類中定義一個接口並在類(片段或活動)中實現它的方法(在你的情況下handleResponse()和handleFault())。 –

回答

0

我注意到您在實例化後臺進程後直接調用for循環。您應該調用handleResponse方法後調用該代碼塊。

for循環代碼放在新方法中,並從handleResponse調用該方法。這樣您就不必擔心返回tasks對象。

你完整的代碼應該是這樣的

Backendless.Persistence.of(Tasks.class).find(
     new AsyncCallback<BackendlessCollection<Tasks>>() { 

      @Override 
      public void handleResponse(BackendlessCollection<Tasks> tc) { 
       List<Tasks> tasks = tc.getData(); 
       doSomethingWithView(tasks); 
       Log.d("ToDo", "Retrieved " + tasks.size() + " tasks"); 
      } 

      @Override 
      public void handleFault(BackendlessFault e) { 
       Log.d("ToDo", "Error: " + e.getMessage()); 
      } 
     }); 

private void doSomethingWithView(List<Tasks> tasks) 
{ 
    LinearLayout taskList = (LinearLayout) findViewById(R.id.taskList); 

    //repeat for each task in list of tasks 
    for (Tasks task :tasks) { 

     //retrieve task text form object and log it 
     String taskText = task.getTask(); 
     Log.d("ToDo", taskText); 

     //create new text view and set task text 
     TextView textView = new TextView(getApplicationContext()); 
     textView.setText(taskText); 

     //add text view to linear layout 
     taskList.addView(textView); 

    } 
} 
+0

我收到錯誤「錯誤:(29,33)錯誤:列表是抽象的;現在不能實例化」。另外,即時通訊嘗試學習Java,那麼你也可以描述你的邏輯呢? –

+0

錯誤:(44,25)錯誤:從內部類中訪問局部變量任務;需要被宣佈爲最終。 –

+0

現在得到「錯誤:(37,37)錯誤:通用陣列創建」 –

0

路易斯·沃瑟曼在評論說,你有什麼是異步的。你打電話.find()和一段時間後handleResponse()將被調用的結果。你不能更快得到結果。

解決方案是執行處理回調中的結果。

例如:

Backendless.Persistence.of(Tasks.class).find(
     new AsyncCallback<BackendlessCollection<Tasks>>() { 
      @Override 
      public void handleResponse(BackendlessCollection<Tasks> tc) { 
       List<Tasks> tasks = tc.getData(); 
       Log.d("ToDo", "Retrieved " + tasks.size() + " tasks"); 

       LinearLayout taskList = (LinearLayout) findViewById(R.id.taskList); 
       //repeat for each task in list of tasks 
       for (Tasks task :tasks) { 
        //retrieve task text form object and log it 
        String taskText = task.getTask(); 
        Log.d("ToDo", taskText); 

        //create new text view and set task text 
        TextView textView = new TextView(getApplicationContext()); 
        textView.setText(taskText); 

        //add text view to linear layout 
        taskList.addView(textView); 
       } 
      } // handleResponse() 

      @Override 
      public void handleFault(BackendlessFault e) { 
       Log.d("ToDo", "Error: " + e.getMessage()); 
      } 
     });