从AsyncTask获取片段消息

时间:2014-10-23 06:03:13

标签: android android-fragments android-asynctask

首先让我道歉,我没有多少代码可以展示。以下是这种情况:我尝试使用AsyncTask在后台运行定期更新。此特定异步任务未在活动或任何内容中定义,而是在其自己的类中定义。我想知道是否有办法让我在doInBackground()方法中将此任务的消息发送到其他地方,例如,代码中的其他地方的片段(此时真的在任何地方)。我已经研究过使用.post(),我正在尝试使用Handler来发送和接收没有运气的消息。提前谢谢!

3 个答案:

答案 0 :(得分:1)

如果要定期向UI线程发送更新,请使用AsyncTask的onProgressUpdate功能。如果要在doInBackground完成后发送消息,请使用AsyncTask的onPostExecute函数。现在,如果要从其中任何一个功能向其他Activity / Fragment发送消息,您可以使用LocalBroadcastManager

您必须在所有接收活动中注册接收者。发件人发送/广播通知,接收者活动/片段监视通知。接收方必须注册广播接收机以接收通知。根据文档:

  

注册并向您的进程中的本地对象发送Intents广播是一个帮手。与使用sendBroadcast(Intent)发送全局广播相比,这有许多优点。其中之一就是您播放的数据不会离开您的应用,因此不必担心泄露私人数据。

要了解如何实施它,您可以看到how to use LocalBroadcastManager?

这是我的2美分。

答案 1 :(得分:1)

在片段或任何地方使用hanlder调用AsycTask:

new DoctorCallReportTask(context,handler, taskData).execute();

你的处理程序片段或任何地方:

Handler handler = new Handler() {
    public void handleMessage(android.os.Message msg) {
        String messages = (String) msg.getData().getSerializable("data");

        Toast.makeText(Context,  messages, Toast.LENGTH_LONG).show();

    }
};

您的AsycTask - 单独的文件类;

import java.util.ArrayList;

import net.iecl.sinorise.R;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

public class DoctorCallReportTask extends AsyncTask<Void, Integer, Void> {
    private Context context;
    private Handler handler;
    private ProgressDialog dialog;
    String data="";

    public DoctorCallReportTask(Context context,Handler handler,String data) {
        this.context = context;
        this.handler = handler;
        this.data=data;
        dialog = new ProgressDialog(context);
    }



    @Override
    protected void onPreExecute() {
        super.onPreExecute();
         this.dialog.setMessage("Resolving Doctor Call Report...");
         this.dialog.show();


    }

    @Override
    protected Void doInBackground(Void... params) {
        result= "You task result return here";
        return null;
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);

    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
         if (dialog.isShowing()) {
                dialog.dismiss();
         }
        Message msg = Message.obtain();
        Bundle b = new Bundle();
        b.putSerializable("data", this.result);
        msg.setData(b);
        handler.sendMessage(msg);
    }



}

答案 2 :(得分:1)

在doInBackground方法中,返回要发送的消息,然后在实例化asynctask的activity或frag中,覆盖onPostExecute来处理消息,例如,如果消息是Int代码:

class MyTask extends AsyncTask<...,...,Int> {
    protected Int doInBackground(.....

....
}

活动:

new MyTask() {
    protected void onPostExecute(Int code) {
       //do some processing of code here.
    }
}.execute(...);