[英]How to debug this Android Studio app
我尝试使用第二个Android应用程序(在Android Studio中)访问网络资源。 我在API 15上的最小,目标和构建目标。 这是我的课。 它根本不是MVC,我只是将在线开发您的第一个Android App教程中的所有内容投入了MainActivity类:
public class MainActivity extends Activity {
private static final String DEBUG_TAG = "HttpExample";
private static final String MYURL = "http://www.server.com/app/service.php";
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.hello_world);
if (savedInstanceState == null) {
getFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment())
.commit();
}
//Check connectivity
ConnectivityManager connMgr = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
//fetch data
new DownloadWebpageTask().execute(MYURL);
textView.setText("Fetching data");
} else {
//show error
textView.setText("No network connection available.");
}
}
//Method to connect to the internet
// Uses AsyncTask to create a task away from the main UI thread. This task takes a
// URL string and uses it to create an HttpUrlConnection. Once the connection
// has been established, the AsyncTask downloads the contents of the webpage as
// an InputStream. Finally, the InputStream is converted into a string, which is
// displayed in the UI by the AsyncTask's onPostExecute method.
private class DownloadWebpageTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
// params comes from the execute() call: params[0] is the url.
try {
return downloadUrl(urls[0]);
} catch (IOException e) {
return "Unable to retrieve web page. URL may be invalid.";
}
}
// onPostExecute displays the results of the AsyncTask.
@Override
protected void onPostExecute(String result) {
textView.setText(result);
}
}
//Method to convert url to url object
// Given a URL, establishes an HttpUrlConnection and retrieves
// the web page content as a InputStream, which it returns as
// a string.
private String downloadUrl(String myurl) throws IOException {
InputStream is = null;
// Only display the first 500 characters of the retrieved
// web page content.
int len = 500;
try {
URL url = new URL(myurl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000 /* milliseconds */);
conn.setConnectTimeout(15000 /* milliseconds */);
conn.setRequestMethod("GET");
conn.setDoInput(true);
// Starts the query
conn.connect();
int response = conn.getResponseCode();
Log.d(DEBUG_TAG, "The response is: " + response);
is = conn.getInputStream();
// Convert the InputStream into a string
String contentAsString = readIt(is, len);
return contentAsString;
// Makes sure that the InputStream is closed after the app is
// finished using it.
} finally {
if (is != null) {
is.close();
}
}
}
//Convert input stream to string
// Reads an InputStream and converts it to a String.
public String readIt(InputStream stream, int len) throws IOException, UnsupportedEncodingException {
Reader reader = null;
reader = new InputStreamReader(stream, "UTF-8");
char[] buffer = new char[len];
reader.read(buffer);
return new String(buffer);
}
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
return rootView;
}
}
}
这是巨大的日志文件:
好吧,我不会发布它,但是我有两个问题:
如何减少log cat中的所有输出。 我已经从冗长的调试切换到了调试,但仍然有很多东西。 在这种情况下,由于应用程序崩溃,我没有时间去做另一个SO帖子所说的选择正在运行的进程,然后点击2个绿色箭头按钮,该按钮仅过滤出正在运行的进程的输出。 在筛选出日志以便我可以查看导致它崩溃的原因之前,我是否需要使该应用程序不崩溃? 否则很难对所有日志进行排序。 最佳做法是什么?
我确实得到了我的日志之一; “ 01-30 10:40:58.665 2047-2072 / com.santiapps.downloadwebdata D / HttpExample:响应为:200”,它在代码中,但随后几行却导致崩溃:
01-30 10:40:58.710 2047-2047 / com.santiapps.downloadwebdata E / AndroidRuntime致命异常:com.santiapps.downloadwebdata.MainActivity $ DownloadWebpageTask.onPostExecute(MainActivity.java:77)处为main java.lang.NullPointerException com.santiapps.downloadwebdata.MainActivity $ DownloadWebpageTask.onPostExecute(MainActivity.java:63)在android.os.AsyncTask.finish(AsyncTask.java:631)在android.os.AsyncTask.access $ 600(AsyncTask.java:177)在android.os.Looper.loop(Looper.java:137)处的android.os.Handler.dispatchMessage(Handler.java:99)处的android.os.AsyncTask $ InternalHandler.handleMessage(AsyncTask.java:644) .ActivityThread.main(ActivityThread.java:5071)(位于java.lang.reflect.Method.invokeNative(本机方法)(位于java.lang.reflect.Method.invoke(Method.java:511))(位于com.android.internal.os) .ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:808)在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:575)在dalvik.system.NativeStart.main(本机方法)01-30 10:40 :58.717 83 7-2676 /? W / ActivityManager:强制完成活动com.santiapps.downloadwebdata / .MainActivity
我看到的是一个空指针异常。 我该如何遵循? 抱歉,我是android新手。 谢谢
您可以通过单击链接来关注logcat,例如MainActivity.java:77 。
您可以通过创建一个新的过滤器来过滤日志,(见图)
您可以在其中按Package Name进行过滤,因此只有您的应用程序日志可见
您的TextView为null ...
通常,您可以这样初始化它:
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.id_of_your_textview);
至于减少日志量,您应该在应用程序的程序包名称上过滤日志。 在Android Studio中,它应该位于Android DDMS面板中“日志级别”的右侧(目前可能显示为“无过滤器”,您需要通过单击“编辑过滤器配置”来创建一个)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.