gpt4 book ai didi

java - 从处理程序 android 调用 asynctask

转载 作者:行者123 更新时间:2023-11-29 21:14:12 25 4
gpt4 key购买 nike

我在对新应用进行一些测试时遇到问题。我有一个 Activity ,我在其中执行一个异步任务来与我的服务器通信并请求一个 json 文件。

我希望定期下载这个文件(不知道,3-4 秒)所以我在我的 Activity 中创建了一个处理程序来每次都执行它。

它在 Logs 上运行良好,但每当我尝试执行 asynctask 时,它都会抛出一个异常:

02-19 10:16:41.510: WARN/System.err(9051): java.lang.IllegalStateException: Cannot execute task: the task is already running.
02-19 10:16:41.510: WARN/System.err(9051): at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:576)
02-19 10:16:41.510: WARN/System.err(9051): at android.os.AsyncTask.execute(AsyncTask.java:535)
02-19 10:16:41.510: WARN/System.err(9051): at com.mobile.myPacket.mySecondActivity.askForData(mySecondActivity.java:68)
02-19 10:16:41.510: WARN/System.err(9051): at com.mobile.myPacket.mySecondActivity.access$000(mySecondActivity.java:22)
02-19 10:16:41.510: WARN/System.err(9051): at com.mobile.myPacket.mySecondActivity$1.run(mySecondActivity.java:56)
02-19 10:16:41.510: WARN/System.err(9051): at android.os.Handler.handleCallback(Handler.java:733)
02-19 10:16:41.510: WARN/System.err(9051): at android.os.Handler.dispatchMessage(Handler.java:95)
02-19 10:16:41.510: WARN/System.err(9051): at android.os.Looper.loop(Looper.java:136)
02-19 10:16:41.510: WARN/System.err(9051): at android.app.ActivityThread.main(ActivityThread.java:5017)
02-19 10:16:41.510: WARN/System.err(9051): at java.lang.reflect.Method.invokeNative(Native Method)
02-19 10:16:41.510: WARN/System.err(9051): at java.lang.reflect.Method.invoke(Method.java:515)
02-19 10:16:41.510: WARN/System.err(9051): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
02-19 10:16:41.510: WARN/System.err(9051): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
02-19 10:16:41.510: WARN/System.err(9051): at dalvik.system.NativeStart.main(Native Method)

我认为这是因为它是另一个线程,第二次调用使第一个调用出现问题。但是我不知道怎么解决。

这是我的 Activity :

            package com.mobile.myPacket;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.mobile.clases.AsyncResponse;
import com.mobile.clases.MyTask;


import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class SecondActivity extends Activity implements AsyncResponse {

private String urlServer = "url";
MyTask asyncTask =new MyTask();
Handler handler = new Handler();


public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
handler.post(sendData);
setContentView(R.layout.secondActivity);
asyncTask.delegate = this;
//We ask for data the first time
askForData();
}


@Override
public void processFinish(JSONArray output) { //Executed from asyncTask
//Data received
Log.i("TEST", output.toString());
}

@Override
protected void onDestroy() {
super.onDestroy();
handler.removeCallbacks(sendData);
}

private final Runnable sendData = new Runnable(){
public void run(){
try {
//prepare and send the data here..

askForData();
//Log.i("TEST","aa");
handler.postDelayed(this, 3000);
}
catch (Exception e) {
e.printStackTrace();
}
}
};

private void askForData(){
Log.i("TEST","askForData");
asyncTask.execute(urlServer+"test.php");
}


}

没有处理程序,asyncTask 只能正常工作一次。所以我想那堂课还可以。

最佳答案

您不能多次执行相同的AsyncTask

在执行AsyncTask之前,先实例化一个新实例:

private void askForData(){
asyncTask = new MyTask();
asyncTask.delegate = this;
asyncTask.execute(urlServer+"test.php");
}

同时删除类开头的 AsyncTask 实例。

关于java - 从处理程序 android 调用 asynctask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21876004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com