2013-02-26 3 views
0

В моем приложении для Android я копирую некоторые данные из базы данных сервера в локальную базу данных. Это может занять более 15 минут. Для более медленных соединений это может быть превышено. Поэтому я хочу отобразить индикатор выполнения.Android Индикатор готовности к ожиданию Не удается создать обработчик внутри потока, который не вызвал ошибку Looper.prepare()

Код размещен ниже.

refresh.setOnClickListener(new OnClickListener(){ 
public void onClick(View v) { 
final ProgressDialog progressDialog = ProgressDialog.show(login.this, "", "Please wait..."); 
new Thread() { 
public void run() { 
try{ 
mySQLiteAdapter.openToWrite(); 
mySQLiteAdapter.deleteAll(); 
radapter.openToWrite(); 
radapter.deleteAll(); 
uadapter.openToWrite(); 
uadapter.deleteAll(); 
     try 
      { 
       HttpClient httpclient = new DefaultHttpClient(); 
       HttpPost httppost = new HttpPost("http://xxxxxxxxxxxxxxxxxxxxx"); 
       HttpResponse response = httpclient.execute(httppost); 
       HttpEntity entity = response.getEntity(); 
        is = entity.getContent(); 
      } catch (UnsupportedEncodingException e) { 
       e.printStackTrace(); 
      } catch (ClientProtocolException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      try { 
       BufferedReader reader = new BufferedReader(new InputStreamReader(
         is, "iso-8859-1"), 8); 
       StringBuilder sb = new StringBuilder(); 
       String line = null; 
       while ((line = reader.readLine()) != null) { 
        sb.append(line + "\n"); 
       } 
       is.close(); 
       json = sb.toString(); 
      } catch (Exception e) { 
      Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG).show(); 
      } 

      try { 
       jObj = new JSONObject(json); 
       contacts = jObj.getJSONArray("get"); 
       for(int i = 0; i < contacts.length(); i++){ 
       JSONObject c = contacts.getJSONObject(i); 
        if(!c.isNull("rname"))// || c.getString("rcode").equals(null)) 
        { 
         rname = c.getString("rname"); 
         rcode = c.getString("rcode"); 
         radapter.insert(rcode, rname); 
        } 
        else 
        { 
         rname = ""; 
         rcode = c.getString("rcode"); 
         radapter.insert(rcode, rname); 
        } 
       } 
       Toast.makeText(getBaseContext(), " Ryot BackUp completed", Toast.LENGTH_SHORT).show(); 

      } catch (JSONException e) { 
       Toast.makeText(getBaseContext(), "Error"+e.toString(), Toast.LENGTH_LONG).show(); 
      } 
        progressDialog.dismiss(); 
       } 
      }.start(); 
      adapter.deleteAll(); 
      oadapter.deleteAll(); 
      e2.setText("Back Up completed"); 
     } 
      catch (Exception e) { 
       Log.e("tag", e.getMessage()); 
       } 
        progressDialog.dismiss(); 
       } 
      }.start(); 
     } 

    }); 

Когда я бегу мое приложение, индикатор отображается только в течение нескольких секунд, а блок Поймайте выполняется, показывая ошибку LogCat в

LogCat:

02-26 14:26:07.151: E/tag(301): Can't create handler inside thread that has not called Looper.prepare() 

Может кто-то Объяснить, что это ошибка в моем коде и как ее решить

+0

типичный случай попыток доступа к ui из другого потока. Решение использует асинтез для фонового материала и доступ к ui в onProgressUpdate и onPostExecute. – njzk2

ответ

0
Toast.makeText(getBaseContext(), " Ryot BackUp completed", Toast.LENGTH_SHORT).show(); 

Проблема в том, используемый вышеуказанным кодом, этот метод изменит интерфейс, вы не сможете обновить интерфейс в потоке, отличном от ui. Таким образом, вам нужно вызвать его из основного потока ui.

Поскольку это трудоемкая работа, я настоятельно рекомендую использовать в Android Android AsyncTask.

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

context.runOnUiThread(new Runnable() { 
    public void run() { 
    Toast.makeText(...).show(); 
    } 
}); 

или обработчик, вы можете взглянуть на How Handler Work in Android. Простой пример:

public Handler mHandler = new Handler() { 

    public void handleMessage(Message msg) { 
      //show toast here 
    } 
} 

protected void startLongRunningOperation() { 

    Thread t = new Thread() { 
     public void run() { 
      //do something here 
      //update the result 
      mHandler.postDelayed(mUpdateResults, 200);} 
      mHandler.post(mUpdateResults); 
     } 
    }; 
    t.start(); 
} 
+0

Как использовать обработчик, можете ли вы разместить образец кода –

+0

Где я должен использовать это? для отображения тоста только –

+0

Обновлен ответ. – StarPinkER

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

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