我尝试将图片从我的Android手机上传到服务中的http服务器。 好吧,我在活动中有一个brodcastreceiver,每次有数据时,它都会将其发送到服务进行上传。但是,我的代码只执行一次上传(我在服务器中查询)然后崩溃(带有任何错误消息)。
我希望有人能告诉我坠机的原因,并提前谢谢你。
PS :我怀疑是在Looper.prepare();和Looper.loop();即使在读完它们之后,我也不是很熟悉它们。
这是我服务的onStartCommand:
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(getBaseContext(), "Service started 2", Toast.LENGTH_LONG).show();
int rssi1 = intent.getIntExtra("key1", 0);
int rssi2 = intent.getIntExtra("key2", 0);
int rssi3 = intent.getIntExtra("key3", 0);
Toast.makeText(getBaseContext(), "Service started 2" + rssi1 +" "+ rssi2 + " " + rssi3, Toast.LENGTH_LONG).show();
Toast.makeText(getBaseContext(), "Service Appel 2", Toast.LENGTH_LONG).show();
upLoadServerUri = "http://192.168.1.150:8080/UploadToServer.php";
mContext = getApplicationContext();
folder = new File("/storage/sdcard");
new Thread(new Runnable()
{
@Override
public void run()
{ Looper.prepare();
imagepath = Environment.getExternalStorageDirectory().toString() + "/downloadedfile1.jpg";
uploadFile(imagepath);
}
}).start();
Looper.loop();
return START_STICKY;
}
答案 0 :(得分:1)
您无需致电Looper.prepare();
和Looper.loop();
。您可以使用AsyncTask在工作线程中执行上载任务。像这样:
class UploadTask extends AsyncTask<String, Object, Object> {
@Override
protected Object doInBackground(String... content) {
uploadFile(content[0]);
return null;
}
}
在服务中:
public int onStartCommand(Intent intent, int flags, int startId) {
imagepath = Environment.getExternalStorageDirectory().toString() + "/downloadedfile1.jpg";
new UploadTask().execute(imagepath, null, null);
}
PS:你可以参考this让自己熟悉Looper和Handler的东西。
答案 1 :(得分:1)
然后我相信你的问题没有上传,因为上传了一张图片...
因为您尝试上传并且它不是UI任务,您可以做的是删除服务并在BroadCastReceiver(BCR)本身中执行...每当在BCR中调用接收时,您可以尝试上传... < / p>
另外对我来说,崩溃是由于线程的连续运行,我认为在上传你删除图像之后所以可能是因为数据原因导致崩溃,但是我的猜测是假的,所以首先你尝试在dat之后上传到BCR本身好吧那么对于服务你可以做一个标志,说明新文件是否来了然后只运行上传功能dat标志可以是BCR的公共静态布尔值,你可以在服务中访问..
希望有所帮助