【问题标题】:Assync task crashes some times异步任务有时会崩溃
【发布时间】: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


【解决方案1】:

问题出在

  public class ShowResponceForAccept extends AsyncTask<String, Void, String>{

在这个方法里面你的调用

  Looper.myLooper().prepare(); 

您应该从 doInBackground 中删除 UI 更新代码并将其推送到 postExecute 并删除 Looper。这应该可以解决问题

【讨论】:

  • 你能告诉我异步任务是如何在没有 doinbackground 的情况下运行的吗?我对这些事情没有太多想法。但我只知道 doinbakground 的返回值将被带到 onpostExecute .. 我对此深信不疑.. 你能给我一些代码示例吗?
  • 你能告诉我异步任务是如何在没有 doinbackground 的情况下运行的吗?我对这些事情没有太多想法。但我只知道 doinbakground 的返回值将被带到 onpostExecute .. 我对此深信不疑.. 你能给我一些代码示例吗?
  • 你的做法是对的,你为什么要使用 Looper 语句?你不需要它。在 doInBackground 中进行任何标注和处理并返回结果。在 postExecute 中使用获得的结果更新你的 UI
  • 我使用了那个 looper 语句,因为当我第一次尝试调用异步任务时它没有工作。所以我在某个地方看到了使用 looper 语句。这就是我使用它的原因:)
【解决方案2】:

问题存在,

您正在尝试在 AsyankTask 执行之间打开 Dialog In。 AsysnkTask 运行时不要更新 UI,更新 onPostExecute。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多