0

У меня есть приложение для поддержки android os 4 и выше. Я использовал Asynctask для вызова веб-службы во время запуска приложения.Asynctask issue on android version <4

Позже я изменил свой minSdkVersion на 9. Для поддержки Android 2.3 и выше. Но тот же код бросает ниже ошибки.

Вызов AsyncTask из SplashActivity нити

mSplashTread = new Thread() {   @Override   public void run() { 
      try { 
       int waited = 0; 
       while (mActive && (waited < mSplashTime)) { 
        sleep(100); 
        if (mActive) { 
         waited += 100; 
        } 
       } 
      } catch (InterruptedException e) { 
       AppUtil.getInstance().logErrorMessage(TAG, e.getMessage()); 
      } finally { 
       if (mIsBackPressed) { 
        finish(); 
       } else { 
        GetMobilePremissionWebservice getMobilePermissionWebservice = new GetMobilePremissionWebservice(
          mContext, SplashActivity.this); 
        getMobilePermissionWebservice.getMobilePermissionInfo(); 
       } 
      }   }  }; 

Вход:

Вызванный: java.lang.RuntimeException: Невозможно создать обработчик внутри потока, который не вызвал Looper.prepare() в android.os.Handler. (Хан dler.java:121) в android.os.AsyncTask $ InternalHandler. (AsyncTask.java:421) в android.os.AsyncTask $ InternalHandler. (AsyncTask.java:421)

Я проверил паутина. Кто-то говорит, что Asynctask внутренне использует обработчик. когда он пытается получить доступ к пользовательскому интерфейсу от doInBackgrond(). Но тот же код работает отлично в os 4 и выше. Я не знаю, в чем проблема с Asynctask на Android версии 2.3.

Пожалуйста, помогите мне в этом.

+1

Не могли бы вы отправить код своей реализации AsyncTask? –

+0

Можете ли вы поделиться кодом? –

+1

В каком потоке вы создаете первый экземпляр asynctask? Похоже, что внутренний потоковый обработчик не был создан в потоке пользовательского интерфейса, поэтому он выдает это исключение. – NazarK

ответ

0

На самом деле проблема в том, я называю AsyncTask из потока.

Использование runOnUiThread Я вызываю Asynctask из потока, это моя проблема.

mSplashTread = new Thread() { 
      @Override 
      public void run() { 
       try { 
        int waited = 0; 
        while (mActive && (waited < mSplashTime)) { 
         sleep(100); 
         if (mActive) { 
          waited += 100; 
         } 
        } 
       } catch (InterruptedException e) { 
        AppUtil.getInstance().logErrorMessage(TAG, e.getMessage()); 
       } finally { 
        if (mIsBackPressed) { 
         finish(); 
        } else { 
         runOnUiThread(new Runnable() { 
          @Override 
          public void run() { 
           GetMobilePremissionWebservice getMobilePermissionWebservice = new GetMobilePremissionWebservice(
             mContext, SplashActivity.this); 
           getMobilePermissionWebservice 
             .getMobilePermissionInfo(); 
          } 
         }); 
        } 
       } 
      } 
     }; 

Но все же я не знаю, почему тот же код работает в версии для Android 4.2 Samsung s3.

0

Попробуйте обновить пользовательский интерфейс на постэкссуте вместо doInBackground. Только fetchdata в doInBackground затем использует эти данные в postexecute для обновления пользовательского интерфейса.

0

Это значит, что вам нужно позвонить по методу AsyncTask.execute(...) в основной поток.

Хотя предыдущее предложение не является технически корректным, это 99% времени предполагаемого поведения. В конце концов вы используете задачу async для разгрузки вычислений из основного потока в фоновый поток. Если вы уже находитесь в фоновом потоке, вам не нужна задача async, не так ли?

0

Потому что правильный формировать для вызова службы является следующим. попробуйте следующие формиат, чтобы ваш звонок сервис веб

private class AsyncCallWS extends AsyncTask<Void, Void, Void> 
{ 
    @Override 
    protected void onPreExecute() 
    { 
     super.onPreExecute(); 
     //show progress dialog 
    } 

    @Override 
    protected Void doInBackground(Void... params) 
    { 
     try 
     { 
      postData(); 
     } 
     catch (Exception e) 
     { 
      // TODO: handle exception 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) 
    { 

     //dismiss progress dialog 
    } 
} 

    public void postData() 
    { 
     Thread t = new Thread() 
     { 
      public void run() 
      { 
       Looper.prepare(); 
       HttpClient httpclient = new DefaultHttpClient();  
       HttpPost httppost = new HttpPost("http://yourURL"); 

       try 
       { 
        // Your webservice code...... 

       } 
       catch (ClientProtocolException e) 
       { 
       e.printStackTrace(); 
       } 
       catch (IOException e) 
       { 
       e.printStackTrace(); 
       } 
       catch (JSONException e) 
       { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       Looper.loop(); //Loop in the message queue 
      } 
     }; 
     t.start(); 
    } 

} 

это будет решить вашу ошибку ...

+0

Это неправильно. В фоновом режиме запустите наш код вне потока пользовательского интерфейса. нам не нужно создавать поток внутри doInBackgground(). Я решил проблему. Пожалуйста, найдите мой ответ ниже. –

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

  • Нет связанных вопросов^_^