【问题标题】:Uploading Images using AsynTask not successful使用 AsyncTask 上传图片不成功
【发布时间】:2012-10-03 10:00:25
【问题描述】:

我想使用 AsnycTask 在 Parse 服务器上上传图像。当我在不使用 AsyncTask 的情况下上传图像时,我成功上传并可以检索图像。我想使用 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):致命异常:主要 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): 在 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): 在 java.lang.reflect.Method.invokeNative(Native Method) 10-12 01:11:07.604: E/AndroidRuntime(2233): 在 java.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): at dalvik.system.NativeStart.main(Native Method) 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 的提供者信息

【问题讨论】:

  • 发布您的堆栈跟踪。同时发布 saveInBackground。
  • 堆栈跟踪意味着 logcat? saveInBackground 是解析服务器提供的方法。它的内置方法不是我创建的。此外,当我开始这项活动时,我又回到了以前的活动。在没有 asynctask 的情况下在单独的项目中执行此操作一切正常。
  • 我对facebook api一无所知,但看起来你的问题来自于此。特别是无法找到 api 工作所需的任何提供程序。尝试验证您的库链接并刷新(清理)您的项目。
  • 把这段代码放到onCreate方法的最后:image = this.findViewById(R.id.id_of_your_image_control);;
  • 感谢您的建议,但我不认为这是图像的问题。

标签: java android upload android-asynctask


【解决方案1】:

使用AsyncTask 有一些并非立即显而易见的限制。其目的是为开发人员提供一种将慢速任务置于后台的简单方法,但仍允许结果填充 UI。但是,根据您使用的 Android 版本,其细节可能会有很大差异,因为在某些版本中,all 您应用程序中的AsyncTask 子类共享同一个线程。在您的情况下,我假设您正在侦听端口以接收图像 - 并且您正在使用 AsyncTask 来执行此操作。您有一个始终在运行的线程,始终使您的应用程序中的所有其他AsyncTask线程无法运行。

请尝试使用RunnableHandler 来绕过它。

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...");
}

【讨论】:

    【解决方案2】:

    从您的堆栈跟踪中,onPostExecute 正在抛出 NullPointerException。从您的代码来看,这一定是因为image 为空。您创建变量:

    ImageView image;
    

    但我看不到你初始化它的任何地方。也许您错过了在onCreate 中调用findViewById 来设置它?

    【讨论】:

    • 我更正了你提到的观点,但我的问题没有解决。我的问题是当这个活动开始时,应用程序会自动返回到上一个活动
    • 所以你之前有一个NullPointerException,你现在在日志中得到什么错误?
    • 我认为错误与更新 logcat 之前相同。我在没有 onPostExecute() 的情况下运行了我的代码,但错误是相同的,它返回到以前的活动
    • 你测试过image是不是null吗?
    • 谢谢我已经解决了我的问题,有一些 sdk 的问题,所以我在清单中进行了更改,上面的代码工作正常
    猜你喜欢
    • 2018-02-10
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 2012-10-07
    • 2016-04-11
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    相关资源
    最近更新 更多