2

AsnycTaskを使用してParseサーバーに画像をアップロードしたい。AsyncTaskを使用せずに画像をアップロードすると、正常にアップロードされ、画像を取得できます。私のアプリでは2つのアクティビティがネットワーク権限を使用しているため、AsyncTaskを使用したいのですが、誰かがこれを行うための別の解決策を持っている場合は教えてください。活動のコード:

package com.example.faceb;

import java.io.ByteArrayOutputStream;
import java.io.File;
import com.parse.GetDataCallback;
import com.parse.ParseException;
import com.parse.ParseFile;
import com.parse.ParseObject;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class ListActivity extends Activity {

    ImageView image;
    TextView value;

    public Bitmap bm;
    public byte[] bitmapdata;
    public ByteArrayOutputStream data;
    String s =  "FileName";

    public void onCreate(Bundle savedInstanceState) {


    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_list);
    uploadTask task = new uploadTask();
    task.execute(s);

}

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

      @Override
        protected void onPostExecute(String result) {
          image.setImageBitmap(bm);
        }

    @Override
    protected String doInBackground(String... params) {
         upload();
        return null;
    }

      }
 public void upload (){
 bm = BitmapFactory.decodeResource(getResources(), R.drawable.back);
    data = new ByteArrayOutputStream();
    bm.compress(Bitmap.CompressFormat.JPEG, 40, data);
    bitmapdata = data.toByteArray();

    ParseFile file = new ParseFile("hai.png", bitmapdata);
    file.saveInBackground();

    ParseObject testObject = new ParseObject("TestObject");
    testObject.put("puu", file);
    testObject.saveInBackground();      

  }
}

以下は私のエラーログキャットです

10-12 01:10:46.944:E / ActivityThread(2233):com.facebook.katana.provider.AttributionIdProviderのプロバイダー情報が見つかりませんでした10-12 01:11:07.604:E / AndroidRuntime(2233):致命的な例外: main 10-12 01:11:07.604:E / AndroidRuntime(2233):java.lang.NullPointerException 10-12 01:11:07.604:E / AndroidRuntime(2233):com.example.faceb.ListActivity $ uploadTask.onPostExecute (ListActivity.java:44)10-12 01:11:07.604:E / AndroidRuntime(2233):com.example.faceb.ListActivity $ uploadTask.onPostExecute(ListActivity.java:1)10-12 01:11:07.604 :E / AndroidRuntime(2233):android.os.AsyncTask.finish(AsyncTask.java:417)10-12 01:11:07.604:E / AndroidRuntime(2233):android.os.AsyncTask.access $ 300(AsyncTask .java:127)10-12 01:11:07.604:E / AndroidRuntime(2233):android.os.AsyncTask $ InternalHandler.handleMessage(AsyncTask.java:429)10-12 01:11:07.604:E / AndroidRuntime(2233):android.os.Handler.dispatchMessage(Handler.java:99)10-12 01:11:07.604:E / AndroidRuntime(2233):at android.os.Looper.loop(Looper.java:123)10-12 01:11:07.604:E / AndroidRuntime(2233):android.app.ActivityThread.main(ActivityThread.java:4627)10-12 01: 11:07.604:E / AndroidRuntime(2233):at java.lang.reflect.Method.invokeNative(Native Method)10-12 01:11:07.604:E / AndroidRuntime(2233):atjava.lang.reflect.Method。 invoke(Method.java:521)10-12 01:11:07.604:E / AndroidRuntime(2233):com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868)10-12 01: 11:07.604:E / AndroidRuntime(2233):com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)10-12 01:11:07.604:E / AndroidRuntime(2233):dalvik.system .NativeStart。main(ネイティブメソッド)10-12 01:11:09.014:E / ActivityThread(2274):com.facebook.katana.provider.AttributionIdProviderのプロバイダー情報が見つかりませんでした10-12 01:48:14.084:E / ActivityThread(2313 ):com.facebook.katana.provider.AttributionIdProviderのプロバイダー情報が見つかりませんでした10-12 01:48:45.323:E / ActivityThread(2334):com.facebook.katana.provider.AttributionIdProviderのプロバイダー情報が見つかりませんでした10- 12 03:19:06.184:E / ActivityThread(2371):com.facebook.katana.provider.AttributionIdProviderのプロバイダー情報が見つかりませんでした10-12 03:19:31.614:E / ActivityThread(2393):プロバイダー情報が見つかりませんでしたcom.facebook.katana.provider.AttributionIdProviderの場合com.facebook.katana.provider.AttributionIdProviderのプロバイダー情報が見つかりませんでした10-1201:48:45.323:E / ActivityThread(2334):com.facebook.katana.provider.AttributionIdProviderのプロバイダー情報が見つかりませんでした10-12 03 :19:06.184:E / ActivityThread(2371):com.facebook.katana.provider.AttributionIdProviderのプロバイダー情報が見つかりませんでした10-12 03:19:31.614:E / ActivityThread(2393):comのプロバイダー情報が見つかりませんでした.facebook.katana.provider.AttributionIdProvidercom.facebook.katana.provider.AttributionIdProviderのプロバイダー情報が見つかりませんでした10-1201:48:45.323:E / ActivityThread(2334):com.facebook.katana.provider.AttributionIdProviderのプロバイダー情報が見つかりませんでした10-12 03 :19:06.184:E / ActivityThread(2371):com.facebook.katana.provider.AttributionIdProviderのプロバイダー情報が見つかりませんでした10-12 03:19:31.614:E / ActivityThread(2393):comのプロバイダー情報が見つかりませんでした.facebook.katana.provider.AttributionIdProvidercom.facebook.katana.provider.AttributionIdProviderのプロバイダー情報が見つかりませんでしたcom.facebook.katana.provider.AttributionIdProviderのプロバイダー情報が見つかりませんでした

4

2 に答える 2

2

使用AsyncTaskには、すぐにはわからないいくつかの制限があります。その意図は、遅いタスクをバックグラウンドに置く簡単な方法を開発者に提供することですが、それでも結果を UI に入力できるようにすることです。ただし、使用している Android のバージョンによっては、アプリケーションのすべての AsyncTaskサブクラスが同じスレッドを共有するバージョンがあるため、その詳細は大幅に異なる場合があります。あなたの場合、ポートでリッスンして画像を受信して​​いると仮定しています-そして、それを行うために を使用しAsyncTaskています。常に実行されているスレッドがあり、アプリ内の他のすべてのスレッドが常に実行されないようにしています。AsyncTask

代わりに、Runnableand Handlerを使用して回避してみてください。

public class TCPClient implements Runnable {

Handler mHandler;
Object[] params;

public static void run(Handler handler, Object... params) {
    TCPClient instance = new TCPClient(handler, params);
    Thread worker = new Thread(instance);
    worker.start();
}

private TCPClient(Handler handler, Object... params) {
    this.params = params;
    mHandler = handler;
}


private void runOnUI(Object result) {
    if (mHandler != null) {
        final Object copy = result;

        mHandler.post(new Runnable() {
            public void run() {
                // Update UI here
            }
        });
    }
}

public void run() {
  // Do slow/background task here
  //Then call
  runOnUI(new String("resulting data..."));
}

これは、次のような UI スレッドで使用できます。

public void onClick(View v) {
  Handler handler = new Handler();
  TCPClient.run(handler, new String("Put outgoing data here...");
}
于 2012-10-12T15:27:36.367 に答える
1

スタックトレースから、onPostExecuteをスローしていNullPointerExceptionます。あなたのコードから、これimageはnullであるためであるに違いありません。変数を作成します。

ImageView image;

しかし、あなたがそれを初期化した場所はどこにも見当たりません。findViewByIdおそらくあなたはそれを設定するための呼び出しを逃してonCreateいますか?

于 2012-10-12T15:42:27.330 に答える