我想使用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();
}
}
以下是我的错误logcat
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):at com.example.faceb.ListActivity $ uploadTask.onPostExecute(ListActivity.java:44) 10-12 01:11:07.604:E / AndroidRuntime(2233):at 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):at java.lang.reflect.Method.invokeNative(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):无法找到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 :(得分:2)
使用AsyncTask
有一些局限性并不是很明显。它的目的是为开发人员提供一种在后台放置缓慢任务的简单方法,但仍允许结果填充UI。但是,根据您所使用的Android版本,其详细信息可能会有很大差异,因为在某些版本中,应用程序中的所有 AsyncTask
子类共享相同的线程。在您的情况下,我假设您正在侦听端口以接收图像 - 并且您正在使用AsyncTask
来执行此操作。您有一个始终在运行的线程,始终保持您应用中所有其他AsyncTask
个线程的运行。
相反,请尝试使用Runnable
和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...");
}
答案 1 :(得分:1)
在您的堆栈跟踪中,onPostExecute
正在投放NullPointerException
。从您的代码来看,这必须是因为image
为空。您创建变量:
ImageView image;
但我无法看到你初始化它的任何地方。也许您错过findViewById
中的onCreate
来设置它?