单击复选框时,我的应用会执行asynctask。我不能让它多次记录消息。它会在第一次点击时发生,但不会再次发生。在查看其他问题之后,我确定我必须构建一个自定义类,当然还要调用新的MyAysncTask(我已经在做了),但它仍然无效。
以下是单击复选框时执行的代码。
cbJoining.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
new MyAsyncTask(EventID, cbJoining.isChecked(), URL_Race, sDates, sState ).execute();
}
});
这是自定义类
class MyAsyncTask extends AsyncTask<Void, Void, Void>{
public String EventID;
public boolean bJoin;
public String URL_Race;
public String sDates;
public String sState;
public MyAsyncTask( String myEventID, boolean mybJoin, String myURL_Race, String mysDates, String mysState){
super();
EventID = myEventID;
bJoin = mybJoin;
URL_Race = myURL_Race;
sDates = mysDates;
sState = mysState;
}
protected void onPreExecute() {
};
@Override
protected Void doInBackground(Void... args) {
//Looper.prepare();
API oAPI = new API();
oAPI.Join(mPrefs, EventID, bJoin, URL_Race, sDates, sState);
Log.d("ASYNCTASK", URL_Race);
//Looper.loop();
return null;
}
protected void onPostExecute(Void result) {
Log.d("ASYNCTASK", "Finished");
};
}
以下是例外情况: 07-16 12:45:10.286:E / AndroidRuntime(28309):致命异常:AsyncTask#2
07-16 12:45:10.286:E / AndroidRuntime(28309):java.lang.RuntimeException:执行doInBackground()时发生错误
07-16 12:45:10.286:E / AndroidRuntime(28309):在android.os.AsyncTask $ 3.done(AsyncTask.java:299)
07-16 12:45:10.286:E / AndroidRuntime(28309):at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
07-16 12:45:10.286:E / AndroidRuntime(28309):at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
07-16 12:45:10.286:E / AndroidRuntime(28309):at java.util.concurrent.FutureTask.run(FutureTask.java:239)
07-16 12:45:10.286:E / AndroidRuntime(28309):在android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:230)
07-16 12:45:10.286:E / AndroidRuntime(28309):at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
07-16 12:45:10.286:E / AndroidRuntime(28309):at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:573)
07-16 12:45:10.286:E / AndroidRuntime(28309):at java.lang.Thread.run(Thread.java:856)
07-16 12:45:10.286:E / AndroidRuntime(28309):引起:java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序
07-16 12:45:10.286:E / AndroidRuntime(28309):在android.os.Handler。(Handler.java:197)
07-16 12:45:10.286:E / AndroidRuntime(28309):在android.os.Handler。(Handler.java:111)
07-16 12:45:10.286:E / AndroidRuntime(28309):在android.app.Activity。(Activity.java:759)
07-16 12:45:10.286:E / AndroidRuntime(28309):at com.chartermatrixllc.motocrossmatrix.API $ FB。(API.java:88)
07-16 12:45:10.286:E / AndroidRuntime(28309):at com.chartermatrixllc.motocrossmatrix.API.Join(API.java:125)
07-16 12:45:10.286:E / AndroidRuntime(28309):at com.chartermatrixllc.motocrossmatrix.Race $ MyAsyncTask.doInBackground(Race.java:207)
07-16 12:45:10.286:E / AndroidRuntime(28309):at com.chartermatrixllc.motocrossmatrix.Race $ MyAsyncTask.doInBackground(Race.java:1)
07-16 12:45:10.286:E / AndroidRuntime(28309):在android.os.AsyncTask $ 2.call(AsyncTask.java:287)
07-16 12:45:10.286:E / AndroidRuntime(28309):at java.util.concurrent.FutureTask.run(FutureTask.java:234)
07-16 12:45:10.286:E / AndroidRuntime(28309):... 4更多
答案 0 :(得分:2)
你可能正在开发Android 4+,从那个版本AsyncTask
只有一个线程你用
Looper.prepare();
Log.d("ASYNCTASK", "Clicked");
Looper.loop();
所以现在你有几个选择:
1)使用方法AsyncTask.executeOnExecutor
并为您提供具有一定数量线程的自己的执行程序,例如Executors.newCachedThreadPool()
2)停止阻止AsyncTask
线程
答案 1 :(得分:0)
由于多种原因,Looper
不能附加到AsyncTask
中的工作线程,其中主要的两个是:
Looper.loop()
,则工作线程处理并等待传入消息,即它阻塞线程,以便不能执行其他任务。这总是一件坏事,但它是API级别11之后的应用程序性能杀手,其中AsyncTask.execute()
按顺序处理任务,使连续任务等待阻塞任务完成。Looper.prepare()
,工作线程也与消息队列相关联。这只能执行一次,因此第二次执行任务并再次调用Looper.prepare()
时,会抛出RuntimeException
。因此,AsyncTask
只能执行一次。从代码示例中不清楚为什么在工作线程上需要Looper
,但如果是必需的,则不应使用AsyncTask
而应使用HandlerThread
。 HandlerThread
是一个Looper
的后台主题。缺点是你必须自己处理在UI线程和后台线程之间传递的消息。
答案 2 :(得分:0)
试试这个,
runOnUiThread(new Runnable() {
@Override
public void run() {
new MyAsyncTask(EventID, cbJoining.isChecked(), URL_Race, sDates, sState ).execute();
}
});
对于任何其他与AsyncTask相关的疑问,你可以参考, https://stackoverflow.com/a/36078608/2249287