我目前正在为我的大学的项目开发一个应用程序。这个项目包括我能够处理我建立的Web服务的同步和同步http请求。我必须创建一个类或一些代码,可以发送http请求(很容易通过AsyncTask完成)并将响应回调给一个活动。
我不知道怎么做,因为onPostExecute()方法是一个void方法,它不返回任何东西,我不能将响应的内容保存在公共变量中,因为它在另一个类。
我想做的是以下内容:
来自活动:
MessageCentre centre = new MessageCentre();
centre.getMessages(1);
1是归因于此设备的Id,它已登录到我的app-server。然后,服务器以JSONArray格式检索与此ID关联的所有消息。我将这些JSONObjects转换为我构建的Message类,并将所有这些新对象保存为MessageCentre类实例中的静态数组。
从此开始,我必须将消息显示给用户,但我不能这样做,因为在getMessages(1)方法中我执行AsyncTask,它在我的应用程序中生成一个辅助线程。所以代码继续如下所示,但是ArrayAdapter没有显示消息(因为他在消息从app-server到达之前呈现适配器)
ArrayAdapter a = new ArrayAdapter(getApplicationContext(),R.id.item_layout, centre.getMessagesList());
listview.setAdapter(a);
我也不想从AsyncTask设置适配器,因为我希望以“黑盒”格式进行设置,用户只需调用方法并通过接收普通对象数组“使其工作”然后在此基础上实现自己的观点。
我也不能简单地通过执行Thread.sleep()来告诉活动等待几秒钟,因为它会使应用程序崩溃并显示ANR错误。
所以有一些方法我可以考虑处理这个问题:
1)在没有ANR的情况下让活动等待一段时间的方法
2)在某种回调方法
中将数据返回到某个不是onPostExecute()方法的活动中3)使得适配器和列表视图可以在运行时更新并创建itens(OnCreateView()方法)以显示消息,在设置和呈现消息后,消息实际到达时,一对几秒钟后,从app-server。
我认为3号更有可能,而且更像是聊天应用程序的功能。我只是不知道如何在运行时更新消息列表。
感谢任何帮助,非常感谢!
答案 0 :(得分: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);
}
}