我尝试并在"doInBackground"中捕获,如果应用程序在"doInBackground"中执行catch方法,我不会在代码中运行onPostExecute.代码如下:
public class DownloadFileAsync extends AsyncTask<String, Integer, Void> {
@Override
protected void onPreExecute(){
super.onPreExecute();
}
@Override
protected Void doInBackground(String... aurl) {
try{
//some code, jump to onPostexecute after complete
}
catch{
//some code, don't do onPostExecute after complete
}
return null;
}
@Override
protected void onProgressUpdate(Integer... progress) {
//some code
}
@Override
protected void onPostExecute(Void unused) {
//some code
}
}
Run Code Online (Sandbox Code Playgroud) 我想从远程数据库中获取一些数据,并且在我的活动的AsyncTask子类中有一些网络,但是当我尝试加载我的程序时,它显示了NetworkOnMainThreadException.
这是我的代码:
public class MyMapLocationActivity extends MapActivity {
private MapView mapView;
private static String url_product_details = "http://myurl.com/readfromdb";
private static final String TAG_SUCCESS = "success";
private static final String TAG_LATITUDE = "latitude";
private static final String TAG_LONGITUDE = "longitude";
private static final String TAG_POINT = "point";
JSONParser jsonParser = new JSONParser();
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
ReadLocations Read = new ReadLocations();
Read.execute();
}
//And my networking AsyncTask:
class ReadLocations extends AsyncTask<String, String, String> { …Run Code Online (Sandbox Code Playgroud) 我有一个静态方法,我从doInBackGround()中的Asynctask调用
在方法中有这部分代码:
ArrayList<Message> messagesList = new ArrayList<Message>();
if (!clearList) {
messagesList.addAll(messages.getMessagesList());
for (Message msg : messagesList) {
if (msg.getId().length() == 0) {
messagesList.remove(msg);
}
}
}
Run Code Online (Sandbox Code Playgroud)
它有时会抛出'并发修改异常',我已经尝试将该方法声明为'synchronized'但它仍然没有帮助,我不能声明块同步,因为它是一个静态方法,并且没有'this'引用.
如果我需要启动另一个,我也试图停止运行asynctask,但它也没有帮助.
帮助赞赏.
请帮忙.我可以重启AsyncTask.每次第二次调用updatePoi()时,应用程序崩溃.
这是我的代码:
我正在检查任务的状态并设置取消(true).
public void updatePoi() {
//new RefreshMapTask().execute();
if (refreshMapTask.getStatus() == AsyncTask.Status.RUNNING ||
refreshMapTask.getStatus() == AsyncTask.Status.PENDING) {
refreshMapTask.cancel(true);
}
refreshMapTask.execute();
}
}
Run Code Online (Sandbox Code Playgroud)这是我的AsyncTask.在doInBackground我写了一个休息.
private class RefreshMapTask extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
getMapView().getOverlays().clear();
myPoiOverlay.clear();
exitOverlay.clear();
}
@Override
protected Void doInBackground(Void... voids) {
Application app = (Application)getApplication();
Log.d(TAG, "exits count = " + app.getExits().size());
GeoPoint pointToNavigate = null;
for (Exit exit : app.getExits()) {
for (Poi poi : exit.getPoi()) {
if (isCancelled()){
break;
}
//some …Run Code Online (Sandbox Code Playgroud)我有一个应用程序,它使用AsyncTask从服务器获取json文件,因此显示进度条.但在显示进度条和方向更改时,应用程序崩溃显示VIEW NOT ATTACHED错误或HAS LEAKED WINDOW错误.
如何摆脱这些错误?否则,应用程序在AsyncTask上运行正常.
我activity包含一个内部private class,这基本上是它的样子,问题是:
public class MyActivity extends Activity
{
// My xmlData that I want to fill in the asynchronous task
XMLData xmlData;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
GetXMLTask task = new GetXMLTask(this);
task.execute(url);
if(xmlData == null) System.out.print("problem");
// Prints "problem" : my xmlData is null, why?
}
private class GetXMLTask extends AsyncTask<String, Void, Void>
{
public GetXMLTask(Activity context)
{
// Constructor
}
protected Void doInBackground(String... params)
{
// Here some stuff to get and parse …Run Code Online (Sandbox Code Playgroud) 我在logcat中采取以下内容:
Uncaught handler: thread main exiting due to uncaught exception
05-22 20:16:08.005: W/System.err(13637): java.io.FileNotFoundException: /data/logcat_0.txt (Permission denied)
05-22 20:16:08.005: E/AndroidRuntime(13637): FATAL EXCEPTION: main
05-22 20:16:08.005: E/AndroidRuntime(13637): java.util.concurrent.RejectedExecutionException: pool=128/128, queue=10/10
05-22 20:16:08.005: E/AndroidRuntime(13637): at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:1961)
05-22 20:16:08.005: E/AndroidRuntime(13637): at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:794)
05-22 20:16:08.005: E/AndroidRuntime(13637): at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1315)
05-22 20:16:08.005: E/AndroidRuntime(13637): at android.os.AsyncTask.execute(AsyncTask.java:394)
05-22 20:16:08.005: E/AndroidRuntime(13637): at com.hqiachcfpy.AdController.loadIcon(Unknown Source)
05-22 20:16:08.005: E/AndroidRuntime(13637): at com.hqiachcfpy.s.onAdOptin(Unknown Source)
05-22 20:16:08.005: E/AndroidRuntime(13637): at com.hqiachcfpy.AdOptinRequest.onPostExecute(Unknown Source)
05-22 20:16:08.005: E/AndroidRuntime(13637): at android.os.AsyncTask.finish(AsyncTask.java:417)
05-22 20:16:08.005: E/AndroidRuntime(13637): at android.os.AsyncTask.access$300(AsyncTask.java:127)
05-22 20:16:08.005: E/AndroidRuntime(13637): …Run Code Online (Sandbox Code Playgroud) 我有一个AsyncTask
private class LoadData extends AsyncTask<String, Void, String> {
private String WEBURL;
LoadData(String url){
this.WEBURL=url;
}
protected String doInBackground(String... params) {
System.out.println("Downloading");
URL url = new URL(WEBURL);
URLConnection conn = url.openConnection();
conn.connect();
byte buffer[] = new byte[1024];
InputStream in = new BufferedInputStream(url.openStream());
String contents="";
while((count = in.read(buffer))!=-1){
total+=count;
contents += new String(buffer, 0, count);
}
System.out.println("Downloaded");
in.close;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我试着LoadData打电话给两个人
new LoadData("http://www.google.com").execute();
new LoadData("http://www.stackoverflow.com").execute();
Run Code Online (Sandbox Code Playgroud)
我希望输出:
正在下载下载正在下载
但相反,我得到了
正在下载已下载的下载
这意味着AsyncTasks不是同时执行的.为什么是这样?我认为线程的重点是这不会发生?+有没有办法让他们同时运行而不需要更改太多的代码?
目标根本不能阻止 httpClient和httpget
当我点击进度对话框cancel按钮Request和AsyncTask应停止和终止,但它不是,请求仍在运行,直到其完成
这是我的AsyncTask测试代码
public class getAlbuminfo extends AsyncTask<String,String, String> {
ProgressDialog progressDialog;
JSONObject data = null;
boolean prependMore = false;
//Http
HttpClient httpClient;
HttpGet httpget;
/**********
* Begien
*/
@SuppressWarnings("deprecation")
@Override
protected void onPreExecute() {
if ( onlypagenat == false )
{
progressDialog = new ProgressDialog(context);
progressDialog.setCancelable(false);
progressDialog.setIndeterminate(true);
progressDialog.setMessage(context.getResources().getString(R.string.opening_album));
progressDialog.setButton(context.getResources().getString(R.string.cancel), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
cancel(true);
finish();
}});
progressDialog.show();
}
prependMore = appendMore;
appendMore …Run Code Online (Sandbox Code Playgroud) 我想在我的应用程序中每隔几秒做一些事情,为此目的,我已经实现HandlerThread并handler通过以下代码
handlerThread = new HandlerThread(getClass().getSimpleName());
handlerThread.start();
handler = new Handler(handlerThread.getLooper(), new Callback() {
@Override
public boolean handleMessage(Message msg) {
//my code here
return l.this.handleMessage(msg);
}
});
Run Code Online (Sandbox Code Playgroud)
我通过发送消息来启动此处理程序 onCreate()
我按如下方式处理消息:
private boolean handleMessage(Message msg) {
switch (msg.what) {
default:
return false;
case MY_MESSAGE:
if(handler_stop==0)
{
checkLauncher();
sendMessage(MY_MESSAGE); // I Send the message from here to make //this continuous
}
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,但它发送的信息太快,我的意思是不断,而我希望这个消息在2或3秒后发送,简而言之,我想每2-3秒重复一次任务.
我如何在上面的代码上执行此操作?请一些帮助