首先让我道歉,我没有多少代码可以展示。以下是这种情况:我尝试使用AsyncTask在后台运行定期更新。此特定异步任务未在活动或任何内容中定义,而是在其自己的类中定义。我想知道是否有办法让我在doInBackground()方法中将此任务的消息发送到其他地方,例如,代码中的其他地方的片段(此时真的在任何地方)。我已经研究过使用.post(),我正在尝试使用Handler来发送和接收没有运气的消息。提前谢谢!
答案 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)
class MyTask extends AsyncTask<...,...,Int> {
protected Int doInBackground(.....
....
}
活动:
new MyTask() {
protected void onPostExecute(Int code) {
//do some processing of code here.
}
}.execute(...);