我试图在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中执行网络操作的最佳实践是什么(无需在ContentProvider中存储数据)?
目前我使用的模式类似于http://www.youtube.com/watch?v=xHXn3Kg2IQE中描述的模式- 包含在Fragment,IntentService和ResultReceiver中的服务助手.
这非常复杂和肮脏.
正在使用类似Fragment(with setRetainInstance(true))的东西,它启动AsyncTasks并且对Activity的回调足够好?
我想我还需要处理在活动暂停然后恢复时完成任务的情况.
有没有比这里提出的更好的策略?
编辑:我所指的网络操作是与简单的JSON Web服务的交互
在我的应用程序中,我想使用网络时间而不是设备的时间.我的应用程序的要求是时间应该是正确的.
我试图从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) 我正在寻找一个例子如何将文件和其他参数一起发送到服务器.
我必须发送服务器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对象,我不知道如何做到这一点.
因此,我想实现 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 Gingerbread(以及较旧的Android版本)上运行良好.我注意到,从用户报告的崩溃错误来看,运行更高版本Android操作系统的手机正在投掷NetworkOnMainThreadException.
我正在尝试通过我的代码并消除/修复所有罪魁祸首.GeoCoder getFromLocation和main getFromLocationName方法会NetworkOnMainThreadException从main/ui线程中调用if吗?
android android-networking android-maps android-3.0-honeycomb
我有一个设置,我按如下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请求以便可以在主线程上处理响应的任何建议吗?
我只需要下载图像,但问题是图像损坏了!我找到了许多下载图像的方法,但仍然出现了这个问题.
我尝试这样做:
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)
我认为它只是阅读图像中的一些行!
在我的应用中,我想广播一些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!
我正在使用一些代码来检测移动数据和蜂窝网络是否可用,如下所示:
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)