2012-03-21 17 views
0

NetworkOnMainThread例外取得: android.os.NetworkOnMainThreadExceptionをは私のデータベースマネージャクラスに次の関数がエラー投げている

この関数は、SQLiteOpenHelper Iを拡張し、私が作成したのDatabaseManagerクラスのパブリックメソッドとして存在しますあなたはUIのコードをブロックし実行しているので、誰かが

public byte[] getBlobFromURL(String url) { 
     byte[] blobData = null; 
     DefaultHttpClient mHttpClient = new DefaultHttpClient(); 
     HttpGet mHttpGet = new HttpGet(url); 
     HttpResponse mHttpResponse; 
     try { 
      mHttpResponse = mHttpClient.execute(mHttpGet); 
      if (mHttpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { 

      HttpEntity entity = mHttpResponse.getEntity(); 
      if (entity != null) { 

      //ContentValues values = new ContentValues(); 
      blobData = EntityUtils.toByteArray(entity); 
      //mContext.getContentResolver().insert(MyBaseColumn.MyTable.CONTENT_URI, values); 
      } 
     } 
     } catch (ClientProtocolException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return blobData; 
    } 
+0

よりも高いレベルだからasynctaskを使用する方がよいかもしれません:http://stackoverflow.com/questions/9745859/networkonmainthread、http://stackoverflow.com/questions/9729825/networkonmainthread-exception-android、http://stackoverflow.com/questions/8427045/how-to-solve-networkonmainthread-exception、http://stackoverflow.com/questions/9156706/what-is-the -error-new-to-android-programming – kabuko

+0

[android.os.NetworkOnMainThreadException]の可能な複製(http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception) – laalto

答えて

2

AsyncTaskを使用してください。または、インライン匿名のRunnableを引数としてThreadを使用します。後者は簡単です、IMHO。

new Thread(new Runnable(){ 
    public void run() 
    { 
     DefaultHttpClient mHttpClient = new DefaultHttpClient(); 
     //And so forth... 
     //... 
    } 
}).start(); 

finalとしてマークし、匿名クラスに(urlのような)外側の変数が見えるようにします。

1

を助けてくださいすることができますが、この例外を得ている...それがバックグラウンドで発生する必要があるため、これは推測、それを設定する方法イム正確にわかりません〜 ead。スレッドまたはAsyncTaskを使用してバックグラウンドで実行する必要があります。これをチェックしてくださいguide

2

これは既にかなり完全にカバーされていますが、Painless Threadingの文書を読んでください。おそらくdoBackgroundの方法をAsyncTaskに入れて、別のスレッドでネットワーク呼び出しを行いたいとします。

2

それは多くの質問に覆われたスレッド

private class GetDataTask extends AsyncTask<Void, Void, String> { 

     private String urlToGet = baseUrl; 

     public GetDataTask() { 

     }      

     @Override 
     protected String doInBackground(Void... params) { 

      try {          

       result = getUrlContent(this.urlToGet);                    

      } catch (Exception e) {     

      } 

      if (isCancelled()) { 
       return null; 
      } 

      return result; 
     } 

     @Override 
     protected void onPostExecute(String result) {    
      setData(result); 
     } 
    } 
関連する問題