0

私は例外に問題がありますNetworkOnMainThreadException

そのため、関数を asynctask に渡す必要があります。問題は、送信時と受信時ではない 2 つのパラメーターを送信する必要があることです。

これらは送信する必要があるパラメーターであるため、asynctask はそれらを受け取ります。

TypedArray array
Boolean true

public void SetImages(TypedArray array){
   SetImages(array, true); // OLD CALL
   new task().execute   // NEW CALL
} 

これは、asynctask に持ち込む必要があるコードです

public void SetImages(TypedArray array, boolean reflected){

    final int reflectionGap = 4;

//          Drawable[] drawables = new Drawable[array.length()];
//          mImages = new CarouselImageView[array.length()];
    mImages = new CarouselImageView[MainActivity.aL_home.size()];
    Log.e("TAG", "SIZE OF: "+MainActivity.aL_home.size());
    for(int i = 0; i< MainActivity.aL_home.size(); i++)
    {
        try {
            Log.e("TAG","url: "+MainActivity.aL_home.get(i).getUrl_imagen());
//              drawables[i] = array.getDrawable(i);
//              Bitmap originalImage = ((BitmapDrawable)drawables[i]).getBitmap();
            Bitmap originalImage = BitmapFactory.decodeStream((InputStream)new URL(MainActivity.aL_home.get(i).getUrl_imagen()).getContent());
            if(reflected){
                int width = originalImage.getWidth();
                int height = originalImage.getHeight();

                // This will not scale but will flip on the Y axis
                Matrix matrix = new Matrix();
                matrix.preScale(1, -1);

                // Create a Bitmap with the flip matrix applied to it.
                // We only want the bottom half of the image
                Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,
                        height / 2, width, height / 2, matrix, false);

                // Create a new bitmap with same width but taller to fit
                // reflection
                Bitmap bitmapWithReflection = Bitmap.createBitmap(width,
                        (height + height / 2), Config.ARGB_8888);

                // Create a new Canvas with the bitmap that's big enough for
                // the image plus gap plus reflection
                Canvas canvas = new Canvas(bitmapWithReflection);
                // Draw in the original image
                canvas.drawBitmap(originalImage, 0, 0, null);
                // Draw in the gap
                Paint deafaultPaint = new Paint();
                canvas.drawRect(0, height, width, height + reflectionGap,
                        deafaultPaint);
                // Draw in the reflection
                canvas.drawBitmap(reflectionImage, 0, height + reflectionGap,
                        null);

                // Create a shader that is a linear gradient that covers the
                // reflection
                Paint paint = new Paint();
                LinearGradient shader = new LinearGradient(0,
                        originalImage.getHeight(), 0,
                        bitmapWithReflection.getHeight() + reflectionGap,
                        0x70ffffff, 0x00ffffff, TileMode.CLAMP);
                // Set the paint to use this shader (linear gradient)
                paint.setShader(shader);
                // Set the Transfer mode to be porter duff and destination in
                paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
                // Draw a rectangle using the paint with our linear gradient
                canvas.drawRect(0, height, width,
                        bitmapWithReflection.getHeight() + reflectionGap, paint);

                originalImage = bitmapWithReflection;
            }

            CarouselImageView imageView = new CarouselImageView(mContext);
            imageView.setImageBitmap(originalImage);
            imageView.setIndex(i);

            ////////imageView.setLayoutParams(new CarouselOld.LayoutParams(120, 180));
            ////////imageView.setScaleType(ScaleType.MATRIX);
            mImages[i] = imageView;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
4

4 に答える 4

1

NetworkOnMainThreadException

この種の例外は、メイン (UI) スレッドと同期されていないバックグラウンド スレッドから UI を操作および変更しようとするとスローされます。

AsyncTask には、UI を更新できるいくつかのメソッドが用意されています。

  • onPreExecute
  • onProgressUpdate
  • onPostExecute

また、前述のメソッドでのみ UI の更新を実行する必要があります。

これは、asynctask に持ち込む必要があるコードです

したがって、メソッドを AsyncTask クラスに移動し、AsyncTask のコンストラクターを介して必要なパラメーター (TypedArray および Boolean) を渡します。

Task task = new Task(arr, boolVariable);
task.execute();
于 2013-04-09T08:54:54.637 に答える
0

メイン スレッドでネットワーク コードを呼び出していると思います。おそらく、何かをコメントアウトするのを忘れていました。

android.os.NetworkOnMainThreadException を修正する方法を参照 してください。

于 2013-04-09T08:53:18.280 に答える
0

メイン UI スレッドでネットワーク関連の操作を実行しているため、NetworkOnMainThread 例外が発生します。これは、Honeycomb SDK 以降を対象とするアプリケーションでのみスローされます。

http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

asynctask を使用する必要があります。

http://developer.android.com/reference/android/os/AsyncTask.html

onCreate() で

new TheTask().execute();

url のようなパラメーターを AsyncTask のコンストラクターに渡し、同じものを doInBackground() で使用することもできます。

class TheTask extends AsyncTask<Void,Void,Void>
{
 protected void onPreExecute()
{           super.onPreExecute();
        //display progressdialog.
} 

protected void doInBackground(Void ...params)//return result here
{  
    //http request. do not update ui here

    return null;
} 

protected void onPostExecute(Void result)//result of doInBackground is passed a parameter
{     
        super.onPostExecute(result);
        //dismiss progressdialog.
        //update ui using the result returned form doInbackground()
 } 
 }

非同期タスクが実行されると、タスクは次の 4 つのステップを経ます。

  1. タスクが実行される前に UI スレッドで呼び出される onPreExecute()。このステップは、通常、タスクをセットアップするために使用されます。たとえば、ユーザー インターフェイスに進行状況バーを表示します。

  2. doInBackground(Params...) onPreExecute() が実行を終了した直後にバックグラウンド スレッドで呼び出されます。このステップは、時間がかかる可能性のあるバックグラウンド計算を実行するために使用されます。非同期タスクのパラメーターがこのステップに渡されます。計算の結果はこのステップで返される必要があり、最後のステップに戻されます。このステップでは、publishProgress(Progress...) を使用して、進行状況の 1 つ以上のユニットを公開することもできます。これらの値は、UI スレッドの onProgressUpdate(Progress...) ステップで発行されます。

  3. onProgressUpdate(Progress...) は、publishProgress(Progress...) の呼び出し後に UI スレッドで呼び出されます。実行のタイミングは未定義です。このメソッドは、バックグラウンド計算がまだ実行されている間に、ユーザー インターフェイスに任意の形式の進行状況を表示するために使用されます。たとえば、進行状況バーをアニメーション化したり、テキスト フィールドにログを表示したりするために使用できます。

  4. onPostExecute(Result) は、バックグラウンドの計算が終了した後に UI スレッドで呼び出されます。バックグラウンド計算の結果は、パラメーターとしてこのステップに渡されます。

于 2013-04-09T08:56:13.907 に答える
0

問題は、パラメータを AsyncTask に渡す方法です。

フォーマットは

private class MyTask extends AsyncTask<Params, Progress, Result> { ... }

http://developer.android.com/reference/android/os/AsyncTask.html

したがって、次のように AsyncTask を定義できます

private class SetImagesTask extends AsyncTask<TypedArray, Void, Void> { 
    protected Void doInBackground(TypedArray... typedArrays) {
        TypedArray array = typedArrays[0];
        ...
    }
    ...
}

そしてそれを次のように呼び出します

new SetImagesTask.execute(array);

ブール値の場合、メイン クラス フィールドまたは静的変数を使用できるため、execute(array) の前に設定できます。または、ブール値を 2 番目の TypedArray にラップし、execute(new TypedArray[] {array, booleanArray}); のようにそれらの配列を渡すことができます。

于 2013-04-09T08:55:59.947 に答える