2013-02-26 36 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(); 
     } 

    }); 

當我跑步時我的應用程序時,會顯示進度條,僅幾秒鐘,並執行Catch塊,顯示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的典型情況。解決方案是使用asynctask作爲背景材料並在onProgressUpdate和onPostExecute中訪問ui。 – njzk2 2013-02-26 09:11:45

回答

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

問題是ca由上面的代碼使用,這個方法會改變UI,你不能在非UI線程中更新UI。所以你需要從主UI線程調用它。

由於這是一項耗時的工作,我強烈建議您在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

如何使用處理程序,你可以發佈示例代碼 – 2013-02-26 09:08:31

+0

我應該在哪裏使用?僅用於顯示烤麪包 – 2013-02-26 09:12:19

+0

更新了答案。 – StarPinkER 2013-02-26 09:19:57

相關問題