Java 异步任务回调未调用
我在获取单独类中异步任务的结果时遇到问题。我在这里已经按照一个类似的问题回答了,但我看不出哪里出了错Java 异步任务回调未调用,java,android,callback,android-asynctask,Java,Android,Callback,Android Asynctask,我在获取单独类中异步任务的结果时遇到问题。我在这里已经按照一个类似的问题回答了,但我看不出哪里出了错 public class StartScreen extends Activity{ ProgressDialog pd; CountDownTimer waitTimer; public static final String APP_PREFERENCES = "AppPrefs"; SharedPreferences settings; SharedPreferences.Edito
public class StartScreen extends Activity{
ProgressDialog pd;
CountDownTimer waitTimer;
public static final String APP_PREFERENCES = "AppPrefs";
SharedPreferences settings;
SharedPreferences.Editor prefEditor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_start_screen);
settings = getSharedPreferences(APP_PREFERENCES, MODE_PRIVATE);
// getPreferences();
// prefEditor = settings.edit();
waitTimer = new CountDownTimer(2000, 300) {
public void onTick(long millisUntilFinished) {
//called every 300 milliseconds, which could be used to
//send messages or some other action
}
public void onFinish() {
//After 2000 milliseconds (2 sec) finish current
//if you would like to execute something when time finishes
pd = ProgressDialog.show(StartScreen.this,"Title","Detail text",true,false,null);
getPreferences();
}
}.start();
}
private void getPreferences() {
String UserName = settings.getString("UserName", null);
if (UserName != null) {
// the key does not exist
Intent intent=new Intent(StartScreen.this,InitialPreferences.class);
startActivity(intent);
} else{
//if (UserName.equals(UserName)){
// handle the value
dataTask();
//pd.dismiss();
}
}
private void dataTask() {
// TODO Auto-generated method stub
new DATATask(this).execute(new FragmentCallback(){
@Override
public void onTaskDone() {
startMainAct();
}
});
}
private void startMainAct() {
Intent intent=new Intent(StartScreen.this,MainActivity.class);
startActivity(intent);
}
public interface FragmentCallback {
public void onTaskDone();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.start_screen, menu);
return true;
}
}
我的AsyncTask在一个单独的类中,为了便于调用,我需要能够得到asyntask已完成的通知,然后开始下一个活动
我希望得到任何帮助,因为我不太清楚自己哪里出了问题
public class StartScreen extends Activity{
ProgressDialog pd;
CountDownTimer waitTimer;
public static final String APP_PREFERENCES = "AppPrefs";
SharedPreferences settings;
SharedPreferences.Editor prefEditor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_start_screen);
settings = getSharedPreferences(APP_PREFERENCES, MODE_PRIVATE);
// getPreferences();
// prefEditor = settings.edit();
waitTimer = new CountDownTimer(2000, 300) {
public void onTick(long millisUntilFinished) {
//called every 300 milliseconds, which could be used to
//send messages or some other action
}
public void onFinish() {
//After 2000 milliseconds (2 sec) finish current
//if you would like to execute something when time finishes
pd = ProgressDialog.show(StartScreen.this,"Title","Detail text",true,false,null);
getPreferences();
}
}.start();
}
private void getPreferences() {
String UserName = settings.getString("UserName", null);
if (UserName != null) {
// the key does not exist
Intent intent=new Intent(StartScreen.this,InitialPreferences.class);
startActivity(intent);
} else{
//if (UserName.equals(UserName)){
// handle the value
dataTask();
//pd.dismiss();
}
}
private void dataTask() {
// TODO Auto-generated method stub
new DATATask(this).execute(new FragmentCallback(){
@Override
public void onTaskDone() {
startMainAct();
}
});
}
private void startMainAct() {
Intent intent=new Intent(StartScreen.this,MainActivity.class);
startActivity(intent);
}
public interface FragmentCallback {
public void onTaskDone();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.start_screen, menu);
return true;
}
}
异步任务:
public class DATATask extends AsyncTask<Void, Void, ArrayList<String>> {
private FragmentCallback mFragmentCallback;
public void execute(FragmentCallback fragmentCallback) {
mFragmentCallback = fragmentCallback;
}
ArrayList<String> arr_data=new ArrayList<String>();
private Context context;
public DATATask(Context context)
{
this.context = context;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected ArrayList<String> doInBackground(Void... params) {
Document docVts, docTide;
String shippingList, tideTimes;
try {
docVts = Jsoup.connect("https://vts.mhpa.co.uk/main_movelistb.asp").timeout(600000).get();
Elements tableRows = docVts.select("table.dynlist td:eq(0),td:eq(1),td:eq(3),td:eq(4),td:eq(7),td:eq(8)");
tableRows.size();
for(int i = 1; i < 80; i++){//only allows x results from vts list, from 1 not 0. 0 produces needless results
shippingList = tableRows.get(i).text().replaceAll(" | ", "") +"\n";
arr_data.add(shippingList);// add value to ArrayList
System.out.println(shippingList);
};
docTide = Jsoup.connect("http://www.mhpa.co.uk/search-tide-times/").timeout(600000).get();
Elements tideTimeOdd = docTide.select("div.tide_row.odd div:eq(0)");
Elements tideTimeEven = docTide.select("div.tide_row.even div:eq(0)");
Elements tideHightOdd = docTide.select("div.tide_row.odd div:eq(2)");
Elements tideHightEven = docTide.select("div.tide_row.even div:eq(2)");
Element firstTideTime = tideTimeOdd.first();
Element secondTideTime = tideTimeEven.first();
Element thirdTideTime = tideTimeOdd.get(1);
Element fourthTideTime = tideTimeEven.get(1);
Element firstTideHight = tideHightOdd.first();
Element secondTideHight = tideHightEven.first();
Element thirdTideHight = tideHightOdd.get(1);
Element fourthTideHight = tideHightEven.get(1);
System.out.println("first tide time: " + firstTideTime.text() + " " + firstTideHight.text());
System.out.println("second tide time: " + secondTideTime.text() + " " + secondTideHight.text() );
System.out.println("third tide time: " + thirdTideTime.text() + " " + thirdTideHight.text());
System.out.println("fourth tide time: " + fourthTideTime.text() + " " + fourthTideHight.text());
{
/*
Work with data - all is OK
*/
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return arr_data;//<< return ArrayList from here
}
@Override
protected void onPostExecute(ArrayList<String> result) {
mFragmentCallback.onTaskDone();
}
}
公共类DATATask扩展了AsyncTask{
私有碎片回调MFFragmentCallback;
public void execute(FragmentCallback FragmentCallback){
MFFragmentCallback=片段回调;
}
ArrayList arr_data=新的ArrayList();
私人语境;
公共数据任务(上下文)
{
this.context=上下文;
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
@凌驾
受保护的ArrayList doInBackground(无效…参数){
文档文档,docide;
字符串shippingList,tideTimes;
试一试{
docVts=Jsoup.connect(“https://vts.mhpa.co.uk/main_movelistb.asp)超时(600000).get();
元素tableRows=docVts.select(“table.dynlist td:eq(0)、td:eq(1)、td:eq(3)、td:eq(4)、td:eq(7)、td:eq(8)”;
tableRows.size();
对于(inti=1;i<80;i++){//只允许来自vts列表的x个结果,而不是0。0生成不必要的结果
shippingList=tableRows.get(i).text().replaceAll(“|”,”)+“\n”;
arr_data.add(shippingList);//向ArrayList添加值
系统输出打印LN(发货清单);
};
docTide=Jsoup.connect(“http://www.mhpa.co.uk/search-tide-times/)超时(600000).get();
Elements tideTimeOdd=docTide.select(“div.tide\u row.odd div:eq(0)”;
Elements tideTimeEven=docTide.select(“div.tide_row.偶数div:eq(0)”;
Elements tideHightOdd=docTide.select(“div.tide\u row.odd div:eq(2)”;
Elements tideHightEven=docTide.select(“div.tide_row.even div:eq(2)”;
元素firstTideTime=tideTimeOdd.first();
元素secondTideTime=tideTimeEven.first();
元素thirdTideTime=tideTimeOdd.get(1);
元素fourthTideTime=tideTimeEven.get(1);
元素firstTideHight=tideHightOdd.first();
元素secondTideHight=tideHightEven.first();
元素thirdThideHight=tideHightOdd.get(1);
元素fourthTideHight=tidehighteen.get(1);
System.out.println(“第一次潮汐时间:+firstTideTime.text()+”+firstTideHight.text());
System.out.println(“第二次潮汐时间:+secondTideTime.text()+”+secondTideHight.text());
System.out.println(“第三次潮汐时间:+thirdTideTime.text()+”+thirdTideHight.text());
System.out.println(“第四次潮汐时间:+fourthTideTime.text()+”+fourthTideHight.text());
{
/*
处理数据-一切正常
*/
}
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回arr_data;//实际上您没有执行AsyncTask。您应该在重载的execute(FragmentCallback)方法中调用“super.execute(Params…Params)”。您没有调用正确的AsyncTask.execute()。正确的execute将调用onPreExecute(),然后调用doInBackground(),然后调用onPostExecute()
将调用此方法(错误的方法):
您要做的是将此方法更改为-setFragmentCallBack(FragmentCallback);
然后在OnPostExecute()中添加以下内容:startMainat();
而不是这样做:
@Override
public void onTaskDone() {
startMainAct();
}
完成后,调用新数据任务(this.execute();
它将调用preExecute()、doInbackground和PostExecute()
您正在做的是将FragCallback添加到DataTask,而不是调用正确的execute函数
我希望这对您有所帮助。在您的活动中:
DataTask DataTask=新建DataTask();
dataTask.execute()
在AsyncTask类中:
onPostExecute(){
//把你的意图放在活动开始或结束后你想做的任何事情上
}
我认为这比你做的要简单得多。希望这能有所帮助。另外,请参见你没有执行AsyncTask
。调用DATATask.execute(FragmentCallback)
将回调分配给你的任务。你需要调用AsyncTask\execute(Runnable)
,AsyncTask\execute(Params…)
或异步任务#executeOnExecutor(Executor exec,Params…Params)
。
另外,我会通过构造函数或setter将回调传递给DATATask
,而不是创建一个新的重载execute(FragmentCallback)
方法。它很容易让人困惑。使用回调方法定义自己的接口
。在两个类中实现接口
。您好,谢谢您的精彩回答,我应该在哪里将方法更改为;setFragmentCallBack(FragmentCallback);感谢DataTask类。替换:public void execute(FragmentCallback FragmentCallback)谢谢
@Override
public void onTaskDone() {
startMainAct();
}