从asynctask回拨回活动

从asynctask回拨回活动

问题描述:

我目前正在为我的大学开发一个项目应用程序。这个项目包括我能够处理同步和异步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号码更有可能,并且更类似于聊天应用程序的功能。我只是不知道如何在运行时更新消息列表。

任何帮助表示赞赏球员,非常感谢!

您可以创建一个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