2017-10-22 173 views
-3

我目前正在爲我的大學開發一個項目應用程序。這個項目包括我能夠處理同步和異步http請求到我建立的web服務。我必須創建一個類或一些可以發送http請求的代碼(通過AsyncTask輕鬆完成)並將回覆回覆給一個活動。從asynctask回撥回活動

我不知道該怎麼做,因爲onPostExecute()方法是一個void方法,它不返回任何內容,並且我不能將響應的內容保存在公共變量中,因爲它在另一類。

我想要做的是:

從活動:

MessageCentre centre = new MessageCentre(); 
centre.getMessages(1); 

的1是一個ID歸因於該設備登錄到我的應用程序服務器。然後服務器以JSONArray格式檢索與此ID關聯的所有消息。我將這些JSONObjects轉換爲我構建的Message類,並將所有這些新對象保存爲MessageCentre類實例內的靜態數組。

從這裏開始,我必須向用戶顯示消息,但是我不能這樣做,因爲在getMessages(1)方法中,我執行一個AsyncTask,它在我的應用程序中生成一個輔助線程。因此,代碼的推移,如下圖所示,而一個ArrayAdapter不顯示消息(因爲他使適配器,消息從應用程序服務器到達之前)

ArrayAdapter a = new ArrayAdapter(getApplicationContext(),R.id.item_layout, centre.getMessagesList()); 
listview.setAdapter(a); 

我也不想設置來自AsyncTask的適配器,因爲我希望以「黑盒子」格式進行操作,用戶可以通過接收普通對象數組來簡單地調用方法並「使其工作」,然後在其上實現自己的視圖。

我也不能簡單地通過執行Thread.sleep()來告訴活動等待幾秒鐘,因爲這使應用程序崩潰並顯示ANR錯誤。

所以有一些方法我能想到的處理這樣的:

1)的方式,使活動等待了一段時間沒有ANR

2)返回數據返回到活動好歹是心不是onPostExecute()方法,在某種回調方法中,使得適配器和列表視圖可以在運行時更新並創建itens(OnCreateView()方法),以在顯示消息之後顯示消息當消息從應用程序服務器實際到達幾秒鐘後被設置和渲染。

我認爲3號碼更有可能,並且更類似於聊天應用程序的功能。我只是不知道如何在運行時更新消息列表。

任何幫助表示讚賞球員,非常感謝!

回答

2

您可以創建一個interface進行回調。

例子:

創建一個類AsyncTaskMessage

public class AsyncTaskMessage extends AsyncTask<Void, Void, Void> { 


    Context context; 
    public OnMessageListener mListener; 

    public interface OnMessageListener { 
     void messageCallback(ArrayList<String> messageList); // you can change the parameter here. depends on what you want. 
    } 

    public AsyncTaskMessage(Context context) { 
     this.context = context; 
     mListener = (OnMessageListener) context; 
    } 

    @Override 
    public void onPreExecute() { 

    } 

    @Override 
    protected void onPostExecute() { 
     // your code goes here for the callback. 
     // messageList - A list of messages. 
     mListener.messageCallback(messageList); 
    } 
} 

那麼你MessageCentre類:

public class MessageCentre { 

    Context context; 
    public void MessageCentre(Context context) { 
     this.context = context; 
    } 

    public void getMessages(int id) { 
     // You said your asyncTask goes here. 
     AsyncTaskMessage async = new AsyncTaskMessage(context); 
     async.execute(); 
    } 
} 

那麼你的活動,其中ArrayAdapter

// A class where your ArrrayAdapter. 
public class MainActivity extends AppCompatActivity implements AsyncTaskMessage.OnMessageListener { 

    //.. 

    public void displayMessage() { 
     MessageCentre centre = new MessageCentre(this); 
     centre.getMessages(1); 
    } 

    @Override 
    public void messageCallback(ArrayList<String> messageList) { 
     Log.i("MainActivity", "Response: " + messageList.toString()); 
     ArrayAdapter a = new ArrayAdapter(getApplicationContext(),R.id.item_layout, messageList); 
     listview.setAdapter(a); 
    } 
} 
+0

我不明白從「messageList」變量應該從哪裏來,我沒有它在AsyncTaskMessage類中。當我實例化AsyncTaskMessage類時,是否將它作爲參數從MessageCentre類傳遞過來? –

+0

此外,我收到了一行在mListener =(OnMessageListener)上下文中的轉換錯誤;在AsyncTaskMessage構造函數內部 –

+0

'messageList'是'centre.getMessagesList()' – Jerrol