-1

Я разрабатываю приложение, которое получает некоторые данные из веб-службы и отображает их в виде списка. Я использую пользовательский адаптер для просмотра списка, который распространяется по классу базового адаптера. и я использую Assync Task для некоторых действий, таких как вызов веб-службы и получение ответа от него и отображение в Toast (в моем списке списка есть две кнопки [Accept and Reject] в каждой строке. когда кто-то нажимает Accept Accept вызывает веб-службу).Сбой задачи Assync

поэтому я реализовал задачи assync внутри класса адаптера.

моя проблема: иногда мое приложение падает, когда я нажимаю список бутов. [При выполнении этой задачи assync]. но иногда он работает правильно.

ошибка что-то вроде:

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(); 

    } 

это является assync задача, которая находится внутри того же адаптера класса

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(); 
     } 


    } 


} 

может кто-нибудь помочь мне в этом?

+1

слишком длинный код. нужны только релевантные части – Raghunandan

+1

Опубликовать только строки, имеющие проблемы – Dunkey

+0

@Raghunandan pls C мои отредактированные коды –

ответ

1

Проблема с

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

В этом методе ваше призвание

Looper.myLooper().prepare(); 

Вы должны удалить UI код Updation из doInBackground и толкать его в postExecute и удалить Looper. Это должно решить проблему

+0

Можете ли вы сказать мне, как задача assync выполняется без doinbackground? У меня нет большой идеи о вещах. но я просто знаю, что возвращаемое значение doinbakground будет взято в onpostExecute .. im confuce об этом .. можете ли вы дать мне несколько примеров кода? –

+0

Можете ли вы сказать мне, как задача assync выполняется без doinbackground? У меня нет большой идеи о вещах. но я просто знаю, что возвращаемое значение doinbakground будет взято в onpostExecute .. im confuce об этом .. можете ли вы дать мне несколько примеров кода? –

+0

Что вы делаете правильно, почему вы используете этот оператор Looper? Вам это не нужно. Выполняйте любую выноску и обработку в doInBackground и возвращайте результат. В postExecute обновите свой пользовательский интерфейс с результатом –

0

Проблема есть,

Вы попытка открыть диалог Между AsyankTask выполнить. Не обновляйте пользовательский интерфейс при запуске AsysnkTask, обновите onPostExecute.

Смежные вопросы