2012-10-12 56 views
2

我想使用AsnycTask将图片上传到Parse服务器上。当我上传图片而不使用AsyncTask时,我成功上传并可以检索图片。我想使用AsyncTask,因为在我的应用程序中有两个活动正在使用网络权限,或者如果有人有另一个解决方案来执行此操作,请告诉。该活动的代码:使用AsynTask上传图片不成功

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();  

    } 
} 

以下是我的错误的logcat

一月10日至12日:10:46.944:E/ActivityThread(2233):无法找到com.facebook.katana供应商信息(2233):致命例外:main 10-12 01:11:07.604:E/AndroidRuntime(2233):java.lang.NullPointerException 10 - 01:11:07.604:E/AndroidRuntime 12 01:11:07.604:E/AndroidRuntime(2233):at com.example.faceb.ListActivity $ uploadTask.onPostExecute(ListActivity.java:44) 10-12 01:11:07.604:E/AndroidRun time(2233):at com.example.faceb.ListActivity $ uploadTask.onPostExecute(ListActivity.java:1) 10-12 01:11:07.604:E/AndroidRuntime(2233):at android.os.AsyncTask.finish( AsyncTask.java:417) 10-12 01:11:07.604:E/AndroidRuntime(2233):at android.os.AsyncTask.access $ 300(AsyncTask.java:127) 10-12 01:11:07.604:E/AndroidRuntime(2233):at android.os.AsyncTask $ InternalHandler.handleMessage(AsyncTask.java:429) 10-12 01:11:07.604:E/AndroidRuntime(2233):at 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):at android.app.ActivityThread.main(ActivityThread.java:4627) 10-12 01:11:07.604:E/AndroidRuntime(2233):at java.lang.reflect.Method.i nvokeNative(Native Method) 10-12 01:11:07.604:E/AndroidRuntime(2233):at java.lang.reflect.Method.invoke(Method.java:521) 10-12 01:11:07.604:E/AndroidRuntime(2233):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868) 10-12 01:11:07.604:E/AndroidRuntime(2233):at 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):无法找到提供呃info for 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

+0

发布您的堆栈跟踪。也发布saveInBackground。 – AedonEtLIRA

+0

堆栈跟踪意味着logcat? saveInBackground是解析服务器提供的方法。它的内置方法不是由我创建的。另外当我开始这个活动时,我回到了之前的活动。这样做没有asynctask在一个单独的项目中一切正常。 –

+0

我对facebook apis一无所知,但看起来你的问题来自于此。特别是无法找到apis工作所需的任何提供者。尝试验证您的库链接并刷新(清理)您的项目。 – AedonEtLIRA

回答

2

使用AsyncTask有一些限制,这些限制不会立即明显。其目的是为开发人员提供一种简单的方法,将缓慢的任务置于后台,但仍允许结果填充UI。但是,根据您所使用的Android版本,其细节可能会有很大差异,因为在某些版本中,全部AsyncTaskAsyncTask您的应用程序中的子类共享相同的线程。就你而言,我假设你正在监听端口以接收图像 - 并且您正在使用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..."); 
} 
1

从您的堆栈跟踪,onPostExecute被扔NullPointerException。从您的代码,这一定是因为image为空。你创建的变量:

ImageView image; 

但我看不到任何你初始化它的地方。也许你错过了拨打onCreatefindViewById来设置它?

+0

我改正了你提到的问题,但我的问题没有解决。我的问题是此活动启动时应用程序返回时自动返回到前一活动 –

+0

因此,您之前得到了'NullPointerException',您现在在日志中遇到什么错误? –

+0

我认为错误与更新logcat之前相同。我已经运行我的代码没有onPostExecute(),但错误是一样的,它返回到先前的活动 –