使用 new API android 测试兼容性时获取空数据
Getting null data when using new API android for testing compatibility
我构建了一个使用 JSON 数据的应用程序,并在 android 设备上进行了测试 APIs 16,我使用库 'okhttp' 连接到服务器端,我使用API16时一切顺利,但是当我使用API17和19时,数据无法显示,只显示错误日志如下:
04-19 16:17:38.394 14379-14411/com.example.mnafian.gambar E/Err IO﹕ java.net.UnknownHostException: http://
这是我用来检索数据的代码示例:
package com.example.mnafian.gambar;
import android.media.Image;
import android.os.AsyncTask;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;
import android.widget.TextView;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.HashMap;
public class MainActivity extends ActionBarActivity {
TextView tv1, tv2;
OkHttpClient clientRest = new OkHttpClient();
String list[] = new String[100];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv1 = (TextView) findViewById(R.id.header_view);
tv2 = (TextView) findViewById(R.id.detail_view);
new LoadText().execute();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public class LoadText extends
AsyncTask<String, Void, String[]> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String[] doInBackground(String... params) {
String list[] = new String[100];
try {
String url = "http://www.samplesite.net/omahnyewo/servicelist.php?type=kontrakan&lat=-7.9425479&long=112.6043546";
Request request = new Request.Builder().url(url)
.build();
Response response = clientRest.newCall(request).execute();
String responsedata = response.body().string();
JSONArray callData = new JSONArray(responsedata);
if (callData != null) {
for (int i = 0; i < callData.length(); i++) {
JSONObject objData = callData.getJSONObject(i);
String tv1 = objData.getString("nama");
String tv2 = objData.getString("harga");
list[0] = tv1;
list[1] = tv2;
}
}
} catch (JSONException eex) {
Log.e("Err JSON", eex.toString());
} catch (IOException eex) {
Log.e("Err IO", eex.toString());
}
return list;
}
@Override
protected void onPostExecute(String[] strings) {
super.onPostExecute(strings);
list = strings;
if (list.length>0){
tv1.setText(list[0]);
tv2.setText(list[1]);
}
}
}
}
上面的代码没有接收到数据,我使用的是2.2.0版本的库okhttp。
我创建的代码有错误吗?
从您的错误日志中,我们可以推断出您尝试访问的 API 的主机不可能是 identified/reached(可能已死)。可能是您的互联网连接或 DNS 服务器有问题。但是,如果您使用的是本地机器,请阅读 this, and this。我的建议是,首先,尝试使用内部浏览器检查您使用的 URI。
我构建了一个使用 JSON 数据的应用程序,并在 android 设备上进行了测试 APIs 16,我使用库 'okhttp' 连接到服务器端,我使用API16时一切顺利,但是当我使用API17和19时,数据无法显示,只显示错误日志如下:
04-19 16:17:38.394 14379-14411/com.example.mnafian.gambar E/Err IO﹕ java.net.UnknownHostException: http://
这是我用来检索数据的代码示例:
package com.example.mnafian.gambar;
import android.media.Image;
import android.os.AsyncTask;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;
import android.widget.TextView;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.HashMap;
public class MainActivity extends ActionBarActivity {
TextView tv1, tv2;
OkHttpClient clientRest = new OkHttpClient();
String list[] = new String[100];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv1 = (TextView) findViewById(R.id.header_view);
tv2 = (TextView) findViewById(R.id.detail_view);
new LoadText().execute();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public class LoadText extends
AsyncTask<String, Void, String[]> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String[] doInBackground(String... params) {
String list[] = new String[100];
try {
String url = "http://www.samplesite.net/omahnyewo/servicelist.php?type=kontrakan&lat=-7.9425479&long=112.6043546";
Request request = new Request.Builder().url(url)
.build();
Response response = clientRest.newCall(request).execute();
String responsedata = response.body().string();
JSONArray callData = new JSONArray(responsedata);
if (callData != null) {
for (int i = 0; i < callData.length(); i++) {
JSONObject objData = callData.getJSONObject(i);
String tv1 = objData.getString("nama");
String tv2 = objData.getString("harga");
list[0] = tv1;
list[1] = tv2;
}
}
} catch (JSONException eex) {
Log.e("Err JSON", eex.toString());
} catch (IOException eex) {
Log.e("Err IO", eex.toString());
}
return list;
}
@Override
protected void onPostExecute(String[] strings) {
super.onPostExecute(strings);
list = strings;
if (list.length>0){
tv1.setText(list[0]);
tv2.setText(list[1]);
}
}
}
}
上面的代码没有接收到数据,我使用的是2.2.0版本的库okhttp。
我创建的代码有错误吗?
从您的错误日志中,我们可以推断出您尝试访问的 API 的主机不可能是 identified/reached(可能已死)。可能是您的互联网连接或 DNS 服务器有问题。但是,如果您使用的是本地机器,请阅读 this, and this。我的建议是,首先,尝试使用内部浏览器检查您使用的 URI。