连接良好时上传图像,Android(后台进程)

Image Upload When Connection is Good, Android (Background process)

如何在后台处理android上的上传图片 当连接良好时?我有架构,当连接良好时可以上传,当连接不好时它会存储在本地并会连接良好时会自动重新上传。

试试这个对我有用:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.widget.Toast;

 public class CheckConnectivity extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent arg1) {

boolean isConnected = arg1.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, 
 false);
if(isConnected){
    Toast.makeText(context, "Internet Connection Lost", Toast.LENGTH_LONG).show();
}
else{
    Toast.makeText(context, "Internet Connected", Toast.LENGTH_LONG).show();
  }
 }
}

Android 清单

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.connect.broadcast"
 android:versionCode="1"
 android:versionName="1.0" >

 <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="8"/>

 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 <uses-permission android:name="android.permission.INTERNET" />

  <application
   android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
     <receiver android:exported="false"
      android:name=".CheckConnectivity" >
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
 </receiver>

您可以使用 constraint on the connection.

将 WorkManager 用于此用例

您应该开始在数据存储中记录要发送到后端的数据,然后将要在连接可用时执行的 WorkRequest 加入队列。 您的工作人员 "just" 需要将数据发送到后端。

要使工作人员排队,您可以使用 (here I'm enqueuing it as a unique work request, to avoid duplication):

val constraints = Constraints.Builder()
        .setRequiredNetworkType(NetworkType.CONNECTED)
        .build()

val syncDataWorker = OneTimeWorkRequestBuilder<SyncDataWorker>()
        .setConstraints(constraints)
        .build()

val operation = WorkManager.getInstance(this)
        .enqueueUniqueWork(
                uniqueConferenceDataWorker,
                ExistingWorkPolicy.KEEP,
                syncDataWorker)

然后你的工作可以用协程Worker完成(a Worker class requires that all the content run synchronously):

class RefreshMainDataWork(context: Context, params: WorkerParameters) :
        CoroutineWorker(context, params) {

    override suspend fun doWork(): Result {
        return try {
            // Retrieve data
            // Sync Data asynchronously with a suspended function
            Result.success()
        } catch (error: TitleRefreshError) {
            Result.failure()
        }
    }
}

像这样的东西也可以为您处理传输过程中的重试和连接丢失。当连接恢复时,工作人员将被停止并重新安排。

如果不知道您需要同步哪些数据以及您正在使用哪些库,则很难进行更详细的介绍。在 coroutine's codelab

中有一个关于如何使用 coroutineWorkers 的示例

可以参考WorkManager's documentation to see how to use it, also there's a simple codelab that shows how to use WorkManager. The codelab is available in Java and in Kotlin.

2019 version of ADSSched (the event app for the Android Developer Summit) uses a similar setup to download updates on request, but it's more complex to follow as it uses Dagger to inject the reference to the use case to refresh the data. Here's the commit.