2012-08-28 20 views
0

這裏,首先我的應用程序同步數據時,將數據同步到本地數據庫中,我查詢一個表檢索其數據,並從我得到的圖片的URI和我使用其他後臺任務下載用戶圖片到我的SD卡和由於我的主要後臺線程是布爾類型,所以我無法調用功能從那裏獲取圖像本身。如果我把從postexecute方法然後我得到NetworkOnMainthread例外 我被困在狀態,我需要使用安全線以下是代碼在Android中使用的安全線:從服務器逃脫networkonmainthread例外

protected void onPreExecute() { 
    mDialog = ProgressDialog.show(viewContext, "", "Synchronizing Data", 
      true); 

}; 

/* 
* (non-Javadoc) 
* 
* @see android.os.AsyncTask#doInBackground(Params[]) 
*/ 
@Override 
protected Boolean doInBackground(Void... arg0) { 
    if (type.contains("ferry")) { 
     return SynchronizeRepositoryFerry(false); 

    } else { 
     return SynchronizeRepositories(false, initialSync); 
    } 
} 

/* 
* (non-Javadoc) 
* 
* @see android.os.AsyncTask#onPostExecute(java.lang.Object) 
*/ 
@Override 
protected void onPostExecute(Boolean result) { 
    this.syncComplete = result; 
    mDialog.dismiss(); 
    if (type.contains("Dash")) { 
     new BackgroundTask().execute(); 
    } 
    else{ 
     Intent intent = new Intent(); 
     intent.setClass(viewContext, classType); 
     viewContext.startActivity(intent); 

    } 


} 

class BackgroundTask extends AsyncTask<Void, Void, Void> { 
    ProgressDialog mDialog; 

    protected void onPreExecute() { 
     mDialog = ProgressDialog.show(viewContext, "", "Loading Images", 
       true); 
    }; 

    @Override 
    protected Void doInBackground(Void... params) { 
     try { 
      int id = 0; 
      String url = "http://i.zdnet.com/blogs/3-29-androids.jpg"; 
      com.jumbybay.businessobjects.User user = new com.jumbybay.businessobjects.User(); 
      DatabaseHelper dbHelper = new DatabaseHelper(viewContext); 
      IUserRepository repository = dbHelper.getUserRepository(); 
      List<com.jumbybay.businessobjects.User> imageList; 
      try { 
       imageList = repository.Retrieve(); 
       for (int i = 0; i < imageList.size(); i++) { 
        user = imageList.get(i); 
        // url = user.getPicture(); 
        id = user.getId(); 
        savesd(id, url); 

       } 
      } catch (SQLException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } catch (final Exception e) { 

     } 
     return null; 
    } 

    public void savesd(int id, String uri) throws IOException { 
     URL url; 
     if (uri == null) { 
      url = new URL("http://i.zdnet.com/blogs/3-29-androids.jpg"); 
     } else { 
      url = new URL(uri); 
     } 
     InputStream input = url.openStream(); 
     try { 
      File storagePath = Environment.getExternalStorageDirectory(); 
      OutputStream output = new FileOutputStream(new File(
        storagePath, +id + ".jpg")); 

      try { 
       byte[] buffer = new byte[20000]; 
       int bytesRead = 0; 
       while ((bytesRead = input.read(buffer, 0, buffer.length)) >= 0) { 
        output.write(buffer, 0, bytesRead); 
       } 
      } finally { 
       output.close(); 
      } 
     } catch (Exception e) { 

      e.printStackTrace(); 
     } finally { 
      input.close(); 
     } 

    } 

    protected void onPostExecute(Void result) { 
     mDialog.dismiss(); 
     Intent intent = new Intent(); 
     /* 
     * intent.setClass(viewContext, classType); 
     * viewContext.startActivity(intent); 
     */ 

     intent.setClass(viewContext, classType); 
     viewContext.startActivity(intent); 

    }; 
} 

回答

1
@Override 
    protected Boolean doInBackground(Void... arg0) { 
     if (type.contains("ferry")) { 
      return SynchronizeRepositoryFerry(false); 

     } else { 
      SynchronizeRepositories(false, initialSync); 
      com.jumbybay.businessobjects.User user = new com.jumbybay.businessobjects.User(); 
      DatabaseHelper dbHelper = new DatabaseHelper(viewContext); 
      IUserRepository repository = dbHelper.getUserRepository(); 
      List<com.jumbybay.businessobjects.User> imageList; 
      try { 
       int id; 
       String url = "http://i.zdnet.com/blogs/3-29-androids.jpg"; 
       imageList = repository.Retrieve(); 
       for (int i = 0; i < imageList.size(); i++) { 
        user = imageList.get(i); 
        // url = user.getPicture(); 
        id = user.getId(); 
        savesd(id, url); 
       } 
      } catch (SQLException e) { 
       // TODO Auto-generated catch block// url = user.getPicture(); 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 
     return SynchronizeRepositories(false, initialSync); 
    } 
0

有這個問題,但第一個兩個解決方案是很好的解決方案。

1)不要寫在主UI線程,使用異步任務爲網絡呼叫。

2)寫下面的代碼到的setContentView(R.layout.activity_main後您的MainActivity文件);但這不是正確的方法。

if (android.os.Build.VERSION.SDK_INT > 9) { 
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
    StrictMode.setThreadPolicy(policy); 
} 

和下面的import語句放到你的java文件中。

import android.os.StrictMode; 

並參見下面的鏈接瞭解更多信息。

Caused by: android.os.NetworkOnMainThreadException