从asynctask回调到活动

时间:2017-10-22 00:33:49

标签: java android multithreading android-asynctask

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

感谢任何帮助,非常感谢!

1 个答案:

答案 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);
    }
}