【发布时间】:2014-01-08 07:54:53
【问题描述】:
我正在开发一个应用程序,它从 Web 服务获取一些数据并显示在列表视图中。我将自定义适配器用于由 Base Adapter 类扩展的列表视图。我已经将 Assync Task 用于某些操作,例如调用 Web 服务并从中获取响应并显示在 Toast 中(在我的列表视图中,每行中有两个按钮 [Accept 和 Reject]。当有人点击接受它时调用网络服务)。
所以我已经在 Adapter 类中实现了我的异步任务。
我的问题是:有时我的应用程序在我单击列表按钮时崩溃。[运行那些异步任务时]。但有时它可以正常工作。
错误类似于:
01-08 12:20:26.919: E/AndroidRuntime(21754): FATAL EXCEPTION: AsyncTask #3
01-08 12:20:26.919: E/AndroidRuntime(21754): java.lang.RuntimeException: An error occured while executing doInBackground()
01-08 12:20:26.919: E/AndroidRuntime(21754): at android.os.AsyncTask$3.done(AsyncTask.java:299)
01-08 12:20:26.919: E/AndroidRuntime(21754): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
01-08 12:20:26.919: E/AndroidRuntime(21754): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
01-08 12:20:26.919: E/AndroidRuntime(21754): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
01-08 12:20:26.919: E/AndroidRuntime(21754): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
01-08 12:20:26.919: E/AndroidRuntime(21754): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
01-08 12:20:26.919: E/AndroidRuntime(21754): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
01-08 12:20:26.919: E/AndroidRuntime(21754): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
01-08 12:20:26.919: E/AndroidRuntime(21754): at java.lang.Thread.run(Thread.java:856)
01-08 12:20:26.919: E/AndroidRuntime(21754): Caused by: java.lang.RuntimeException: Only one Looper may be created per thread
01-08 12:20:26.919: E/AndroidRuntime(21754): at android.os.Looper.prepare(Looper.java:78)
01-08 12:20:26.919: E/AndroidRuntime(21754): at android.os.Looper.prepare(Looper.java:73)
01-08 12:20:26.919: E/AndroidRuntime(21754): at com.jsonlist.jsonlist.NewsRowAdapter$ShowResponceForReject.doInBackground(NewsRowAdapter.java:646)
01-08 12:20:26.919: E/AndroidRuntime(21754): at com.jsonlist.jsonlist.NewsRowAdapter$ShowResponceForReject.doInBackground(NewsRowAdapter.java:1)
谁能告诉我错误在哪里?
这些是它引用的代码
public void dialogshow(final String appid){
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(activity);
alertDialogBuilder.setTitle("Confirm your Action!");
// set dialog message
alertDialogBuilder
.setMessage("Click yes Confirm!!")
.setCancelable(false)
.setPositiveButton("Yes",new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int id) {
// new ShowResponceForAccept().execute("");
//dialog.dismiss();
Handler mHandler=new Handler();
mHandler.post(new Runnable()
{
public void run()
{
new ShowResponceForAccept().execute(appid);
}
});
/* ShortList sendandget = new ShortList();
//long appoinmentID = Long.valueOf(appid);
//long user = Long.valueOf(Uid);
String resp = sendandget.getResponceFromServer(appid,"",Uid);
Appid = null;
Uid = null;
//Toast.makeText(mContext, resp, Toast.LENGTH_LONG).show();
loadListAgain();*/
}
})
.setNegativeButton("No",new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int id) {
dialog.cancel();
}
});
alertDialogBuilder.show();
}
这是同一个适配器类中的异步任务
public class ShowResponceForAccept extends AsyncTask<String, Void, String>{
private ProgressDialog pDialog;
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
pDialog = ProgressDialog.show(activity, "Sending Request", "getting Responce.", true, false);
}
@SuppressWarnings("static-access")
@Override
protected String doInBackground(String... arg0) {
// TODO Auto-generated method stub
Looper.myLooper().prepare();
ShortList sendandget = new ShortList();
String app = arg0[0];
//long appoinmentID = Long.valueOf(app);
//long user = Long.valueOf(Uid);
String resp = sendandget.getResponceFromServer(app,"",Uid);
loadListAgain();
//Thread.sleep(10000);
//String x="Your Request Accepted";
return resp;
//return x;
}
@Override
protected void onPostExecute(String resp) {
// TODO Auto-generated method stub
if(pDialog != null){
pDialog.dismiss();
}
if(resp.equalsIgnoreCase("true")){
Toast.makeText(mContext, "Your Request has been Successfully Accepted!", Toast.LENGTH_LONG).show();
}
else{
Toast.makeText(mContext, "Sorry! Try again Later!", Toast.LENGTH_LONG).show();
}
}
}
有人可以帮我吗?
【问题讨论】:
-
代码太长。只需要相关部分
-
只发布有问题的行
-
@Raghunandan 请输入我编辑的代码
-
@BatuhanC 我已经检查过了...错误仍然存在..因为仅当我在应用程序首次启动时按下登录按钮并且当我单击接受或拒绝时才会发生此错误列表视图
-
@Dunkey 这条线是 Looper.myLooper().prepare();
标签: android multithreading android-listview android-asynctask