标签: android-networking

检查片段中的网络连接

我试图在SherlockFragment中检查网络连接,但无法识别getSystemService()方法.

以下是我的代码(来自http://developer.android.com/training/basics/network-ops/connecting.html)

    ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
    if (networkInfo != null && networkInfo.isConnected()) {
        // fetch data
    } else {
        // display error
    }
Run Code Online (Sandbox Code Playgroud)

提前致谢

android android-networking

3
推荐指数
1
解决办法
1万
查看次数

在Android中执行网络操作的最佳做​​法是什么?

在Android中执行网络操作的最佳实践是什么(无需在ContentProvider中存储数据)?

目前我使用的模式类似于http://www.youtube.com/watch?v=xHXn3Kg2IQE中描述的模式- 包含在Fragment,IntentService和ResultReceiver中的服务助手.

这非常复杂和肮脏.

正在使用类似Fragment(with setRetainInstance(true))的东西,它启动AsyncTasks并且对Activity的回调足够好?

我想我还需要处理在活动暂停然后恢复时完成任务的情况.

有没有比这里提出的更好的策略?

编辑:我所指的网络操作是与简单的JSON Web服务的交互

android android-networking

3
推荐指数
1
解决办法
4490
查看次数

如何从Android中的网络中获取时间

在我的应用程序中,我想使用网络时间而不是设备的时间.我的应用程序的要求是时间应该是正确的.

我试图从NTS服务器获得时间,但加载器继续运行并且不停止我等待超过30分钟,但我仍然没有得到任何东西.

我想知道是否有任何其他方法来获取来自网络,因为我没有从网络中获取时间花费这么多时间.

public class MainActivity extends Activity  {

public static final String TIME_SERVER = "time-a.nist.gov";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button btnGetTime = (Button)findViewById(R.id.button1);

     btnGetTime.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            // Perform action on click 
              new GetTimeFromNetwork().execute();
        }
    });

   }

 public class GetTimeFromNetwork extends AsyncTask<String, Void, String> {

    ProgressDialog progressDialog;

    @Override
    protected void onPreExecute() {

        progressDialog = new ProgressDialog(MainActivity.this);
        progressDialog.setMessage("Loading...");
        progressDialog.setCancelable(false);
        progressDialog.show();
        Log.i( "pre execute","yes"); 

    }


    @Override
    protected String doInBackground(String... …
Run Code Online (Sandbox Code Playgroud)

java android android-networking

3
推荐指数
1
解决办法
5563
查看次数

如何使用改造2将文件和其他参数一起发送

我正在寻找一个例子如何将文件和其他参数一起发送到服务器.

我必须发送服务器JSON

{
    "title": "title",
    "file": "uploaded file instance",
    "location": {
        "lat": 48.8583,
        "lng": 2.29232,
        "place": "Eiffel Tower"
    }
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能创建Retrofit来处理这种情况?

如果file是一个字符串,我知道如何处理它.如果file是File对象,我不知道如何做到这一点.

android android-networking retrofit retrofit2

3
推荐指数
1
解决办法
5181
查看次数

使用 RxJava2 改造响应代码

因此,我想实现 API 响应的示例,如视频 droidcon NYC 2017 - Advanced Networking with RxJava + Retrofit中所示

这是我的代码:

演示者.java

compositeDisposable.add(RetrofitClient.createService(GetApi.class)
            .getResponseFromServer(token)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Consumer<ResponseFromServer>() {
                @Override
                public void accept(ResponseFromServer responseFromServer) throws Exception {
                    mView.setResponseObject(responseFromServer);
                }
            }, new Consumer<Throwable>() {
                @Override
                public void accept(Throwable throwable) throws Exception {
                    throwable.printStackTrace();
                    if (throwable instanceof HttpException) {
                        int responseCode = ((HttpException) throwable).code();
                    }

                }
            }));
Run Code Online (Sandbox Code Playgroud)

所以在这里,当我从服务器收到一些 4xx 错误响应时,我可以去Throwable获取响应代码,如果响应正常,我可以获取我的对象,一切都很酷。

然而,在上面的视频示例中,那家伙建议我用ResponseFromServer响应包装我的代码,如下所示: Single<Response<ResponseFromServer>> getResponseFromServer(@Header("X-Authorize") String token);这样我也可以访问响应代码,但在这种情况下,我的Throwable永远不会被调用,所以我只能在第一个接受中访问代码方法,但在视频中他发现了​​该Throwable部分的错误。所以,我无法弄清楚我做错了什么?也许我使用了错误的观察者?

android android-networking retrofit2 rx-java2

3
推荐指数
1
解决办法
2202
查看次数

GeoCoder getFromLocation方法可以引发NetworkOnMainThreadException吗?

我有一个应用程序经过彻底测试,在Android Gingerbread(以及较旧的Android版本)上运行良好.我注意到,从用户报告的崩溃错误来看,运行更高版本Android操作系统的手机正在投掷NetworkOnMainThreadException.

我正在尝试通过我的代码并消除/修复所有罪魁祸首.GeoCoder getFromLocation和main getFromLocationName方法会NetworkOnMainThreadException从main/ui线程中调用if吗?

android android-networking android-maps android-3.0-honeycomb

2
推荐指数
1
解决办法
3430
查看次数

EntityUtils.toString()是否会导致NetworkOnMainThreadException?

我有一个设置,我按如下doInBackground()方法执行我的http请求AsyncTask:

@Override
protected HttpResponse doInBackground(HttpRequestBase... httpRequests)
{
    HttpResponse httpResponse = HttpClient.execute(HttpUriRequest);
    return httpResponse;
}
Run Code Online (Sandbox Code Playgroud)

HttpResponse然后将此对象传递给onPostExecute()我的方法,AsyncTask以传递给处理程序(http请求的原始调用者)并根据需要进行处理,如下所示:

  • 使用检查响应代码httpResponse.getStatusLine().getStatusCode();
  • 获取响应内容使用EntityUtils.toString(httpResponse.getEntity())).

此设置在运行旧版Android的手机上运行良好.

现在在冰淇淋三明治(Galaxy Nexus)上运行我的应用程序我发现上面我的应用程序中的前几个http请求工作正常,但是有一个http请求始终抛出异常,堆栈跟踪如下(略微修剪为可读性):

....

at org.apache.http.util.EntityUtils.toString(EntityUtils.java:139)

在java.io.InputStreamReader.close(InputStreamReader.java:145)

在org.apache.http.conn.EofSensorInputStream.close(EofSensorInputStream.java:213)

...

在libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:151)

在android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1084)

android.os.NetworkOnMainThreadException

我很迷惑.这是否意味着该EntityUtils.toString(HttpEntity)方法是投掷新的潜在罪魁祸首(并且非常烦人)NetworkOnMainThreadException?如果是这样,有关重新设置我的设置以在单独的线程中发出http请求以便可以在主线程上处理响应的任何建议吗?

android android-networking android-compatibility

2
推荐指数
1
解决办法
4863
查看次数

下载图像在Android应用程序中被破坏

我只需要下载图像,但问题是图像损坏了!我找到了许多下载图像的方法,但仍然出现了这个问题.

我尝试这样做:

File path = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES);
File file2 = new File(path,"DemoPictureX.png");
InputStream is=(InputStream) new URL("http://androidsaveitem.appspot.com/downloadjpg").getContent();
OutputStream os = new FileOutputStream(file2);
byte[] data = new byte[is.available()];
is.read(data);
os.write(data);

is.close();
os.close();
Run Code Online (Sandbox Code Playgroud)

我认为它只是阅读图像中的一些行!

android android-networking android-image android-internet

2
推荐指数
1
解决办法
1017
查看次数

Android在启用热点的设备上发送UDP广播

在我的应用中,我想广播一些UDP数据包。我目前正在使用此方法来获取所需的广播地址:

InetAddress getBroadcastAddress() throws IOException {
WifiManager wifi = mContext.getSystemService(Context.WIFI_SERVICE);
DhcpInfo dhcp = wifi.getDhcpInfo();
// handle null somehow

int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask;
byte[] quads = new byte[4];
for (int k = 0; k < 4; k++)
  quads[k] = (byte) ((broadcast >> k * 8) & 0xFF);
return InetAddress.getByAddress(quads);
}  
Run Code Online (Sandbox Code Playgroud)

-> https://code.google.com/p/boxeeremote/wiki/AndroidUDP

效果很好,但是如果设备已激活热点并尝试在引发SocketException之后尝试广播数据包:SocketException: sendto failed: ENETUNREACH (Network is unreachable)
如何在“提供”热点的设备上获取正确的广播地址?我尝试过的所有单播地址都运行良好...

问候与问候

PS:最小的SDK是API 8

android udp broadcast wifi android-networking

2
推荐指数
1
解决办法
3599
查看次数

Android 7 ConnectivityManager requestNetwork()行为

我正在使用一些代码来检测移动数据和蜂窝网络是否可用,如下所示:

final ConnectivityManager connection_manager =
                (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);

boolean mobileDataEnabled = false;

try {
    Class cmClass = Class.forName(connection_manager.getClass().getName());
    Method method = cmClass.getDeclaredMethod("getMobileDataEnabled");
    method.setAccessible(true); // Make the method callable
    // get the setting for "mobile data"
    mobileDataEnabled = (Boolean)method.invoke(connection_manager);
} catch (Exception e) {
}

if(mobileDataEnabled == true) {
    Log.d(TAG, "mobileDataEnabled == true");
} else {
    Log.d(TAG, "mobileDataEnabled == false");
}

NetworkRequest.Builder request = new NetworkRequest.Builder();
request.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);

connection_manager.requestNetwork(request.build(), new ConnectivityManager.NetworkCallback()
{
    @Override
    public void onAvailable(Network network)
    {Log.d(TAG, "requestNetwork onAvailable()");}

    @Override
        public void …
Run Code Online (Sandbox Code Playgroud)

android android-networking

2
推荐指数
1
解决办法
2693
查看次数