Android服务:将图像上传到http服务器

时间:2014-04-21 09:37:04

标签: android service upload broadcastreceiver httpserver

我尝试将图片从我的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;
    }

2 个答案:

答案 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的公共静态布尔值,你可以在服务中访问..

希望有所帮助