Android異常android.os.Network OnMainThreadException


最近、Androidでのデータ収集を実現したSDKでは、ユーザがHTTPを使ってクラウドプラットフォームにデータを収集し、データ解析を行う。しかし、時報を送信していますが、次のようなエラーがあります。
Caused by:android.os.Network OnMainThreadException
発生した原因、公式解釈:
Class Overview
The exception that is thrown when an application attempts to perform a networking operation on its main thread.

This is only thrown for applications targeting the Honeycomb SDK or higher. Applications targeting earlier SDK versions are allowed to do networking on their main event loop threads, but it's heavily discouraged. See the document Designing for Responsiveness.

Also see StrictMode.
http://developer.android.com/intl/zh-cn/reference/android/os/NetworkOnMainThreadException.html
上記の意味は、SDK 3.0から、googleは、ネットワーク要求(HTTP、Socket)などの関連操作をそのままメインスレッドにすることを許可しなくなりましたが、本来はこのようにすべきではないです。直接にUIスレッドでネットワーク操作すると、UI、ユーザー体験が滞ります。つまり、SDK 3.0以下のバージョンでは、メインスレッドで引き続きこのようにしてもいいです。3.0以上ではだめです。したがって、以下のコードでは、Thread、Runnable、Handlerの3種類を使用します。
public void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    this.setContentView(R.layout.test);  
    //        ,      ,       ,  handler  UI  
    new Thread(networkTask).start();  
}  
  
Handler handler = new Handler() {  
    @Override  
    public void handleMessage(Message msg) {  
        super.handleMessage(msg);  
        Bundle data = msg.getData();  
        String val = data.getString("value");  
        Log.i("mylog", "     -->" + val);  
        // UI            
    }  
};  
  
/** 
 *            
 */  
Runnable networkTask = new Runnable() {  
  
    @Override  
    public void run() {  
        //       http request.          
	MobEventService.postonKillProcess(context);
        Message msg = new Message();  
        Bundle data = new Bundle();  
        data.putString("value", "    ");  
        msg.setData(data);  
        handler.sendMessage(msg);  
    }  
};  
第二に、非同期機構を使用して、asynctaskというように、これは簡単にネット画像をロードする例を挙げます。
class DownImage extends AsyncTask {  
  
    private ImageView imageView;  
  
    public DownImage(ImageView imageView) {  
        this.imageView = imageView;  
    }  
  
    @Override  
    protected Bitmap doInBackground(String... params) {  
        String url = params[0];  
        Bitmap bitmap = null;  
        try {  
            //          
            InputStream is = new URL(url).openStream();  
            bitmap = BitmapFactory.decodeStream(is);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return bitmap;  
    }  
  
    @Override  
    protected void onPostExecute(Bitmap result) {  
        imageView.setImageBitmap(result);  
    }  
}  
第三種類、直接無視して、強制的に使用します。
MainActivityファイルのsetContentView(R.layout.activity umain)には、以下のコードが付けられています。
if (android.os.Build.VERSION.SDK_INT > 9) {
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
}
を覚えてください。このハンドルがPostのRunnableと処理のメッセージは現在のメインラインプログラムにあります。非子スレッドです。