1. 程式人生 > >我的第一個Volley程式遇到的坑

我的第一個Volley程式遇到的坑

最近公司OA網站要改版,需要做個APP出來。所以開始學習APP開發,先從安卓學起,因為各方面成本比較低。

OA功能需要上傳圖片和附件,所以先看了安卓網路傳輸相關的內容。起初找了個用 HttpURLConnection 類寫的程式,執行之後不太順暢,沒跑成功,報了很多錯。大概有以下幾種:

  1. 網路連線異常報錯,經查,安卓4.0之後,為了考慮到易用性,安卓不再允許在主執行緒中做類似網路請求之類的耗時操作。後來增加了嚴格模式(StrictMode)來處理,但是感覺不太靠譜。
  2. 程式在讀取圖片時,總是報錯 java.io.FileNotFoundException, permission denied,後來發現是讀取許可權沒加,於是在Manifest.xml中增加許可權。
  3. 繼續除錯,後來又報錯 java.net.ProtocalException:method dose not support a rquest body:GET. 可我明明用的是post方法嘛
conn.setRequestMethod("POST");

找不出原因了。。。翻了翻資料,發現了Volley這個網路框架。

一、初識Volley

看網上的介紹說,Volley是一個Andorid開發團隊在2013年推出了一個新的網路通訊框架,大概有以下優點:

1 先說HTTP的用法太複雜,如果不進行封裝,會造成重複程式碼 且不易使用;
2 既可以進行簡單的HTTP通訊,也可以載入網路上的圖片;
3 效能方面表現還不錯,尤其適用資料量不大但通訊頻繁的場景;
4 簡單易用;

二、Volley配置與使用

  1. 在網上下載了Volley.jar包,拷貝到app\libs資料夾下,右鍵–add as library,

     just like this:
    

這裡寫圖片描述

  1. 配置完jar包之後,還需要三步才能使用Volley。
RequestQueue queue= Volley.newRequestQueue(this);//step 1
        StringRequest request=new StringRequest("https://www.baidu.com/", new Response.Listener<String>() {
            @Override
            public void onResponse(String s) {
                Log.d("success",s);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {

            }
        });//step 2
        queue.add(request);//step 3
step1. 建立用來執行請求的請求佇列;
step2. 構建一個請求物件;
step3. 將請求物件加到請求佇列裡;

3.三步走走完之後,開始執行程式。

我的程式碼是這樣的:

MainActivity.java

package com.example.huangs.myvolley;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        System.out.println("dddddddddddddddddd");
        setContentView(R.layout.activity_main);
        Log.i("ssss","ssss");
        getStringRequest();
    }

    private void getStringRequest() {
        //String url="http://10.10.71.66:8080/TestProject/DataReceiveServlet";
        String url="https://www.baidu.com/";
        RequestQueue queue= Volley.newRequestQueue(this);
        StringRequest request=new StringRequest("https://www.baidu.com/", new Response.Listener<String>() {
            @Override
            public void onResponse(String s) {
                Log.d("success",s);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {

            }
        });
        queue.add(request);
    }
}

Activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.huangs.myvolley.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

三、遇到的那些坑

執行之後,程式除了顯示HelloWorld的介面,控制檯沒有看到我在程式裡列印的輸出。也就是我的

System.out.println("dddddddddddddddddd");
Log.d("success",s);

這些都沒打印出來。
後來查了好多資料,發現重啟Andorid Studio 是最好使的@

重啟之後,但是控制檯報錯

沒有網路許可權?可是我明明加了呀。

經過檢查, 加錯地方了。

注意:

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

是和application標籤一個層次的。

四、 大功告成

經過這一頓折騰,我的第一個Volley程式終於跑成功了。https://www.baidu.com/ 給返回了內容。

這裡寫圖片描述

這裡寫圖片描述

這只是最基本的Get請求,後續繼續研究上傳圖片等複雜的POST請求。

相關推薦

一個Volley程式遇到的

最近公司OA網站要改版,需要做個APP出來。所以開始學習APP開發,先從安卓學起,因為各方面成本比較低。 OA功能需要上傳圖片和附件,所以先看了安卓網路傳輸相關的內容。起初找了個用 HttpURLConnection 類寫的程式,執行之後不太順暢,沒跑成功,報了

一個Hibernate程式

今天開始學習Hibernate,開啟我的第一個Hibernate程式  首先,建立一個數據庫student 第二步,在student資料庫中建立一張表student     第三步,開啟 myeclipse10,開啟MyEclipse Hibernate pre

一個Golang程式

本程式參考:GO語言實戰 GO IN ACTION package main import ( "fmt" "runtime" "sync" ) func main(){ //分配一個邏輯處理器給排程器使用 runtime.GOMAXPROCS(1) /

一個django程式

我的第一個django程式 學習django是我進入Python基礎以後開始的一項很重要的事情, 按照網際網路行業的說法, 至少基礎的web框架要熟悉。 下載安裝django, 我用的是pip包安裝。 pip install django 完成後我

一個C程式hello也是困難重重

昨天半天的時間,我終於把虛擬機器裝好了centos+emacs,今天我興致勃勃的來開始第一個hello程式,然而事情沒有我想象的順利,按照論壇裡大家的教程我輸入了一小段程式,然後按部就班gcc各種不識別,最後是因為我沒有輸入“.c” 之後gcc有出錯,研究一下發現單詞拼寫錯了,暈死stdio.h

WCF學習筆記(一)---一個WCF程式

一、建立WCF程式   1.建立一個控制檯程式(WCFBlog)   2.新增wcf專案   3.將預設的IService1和Service1改成自己的名字   4.在ICalculateService裡寫契約 // TODO

一個C程式

我的第一個C程式 在摸索如何使用電腦上瞎安裝的VS-2013時,我從頭到尾就使用了一個小程式來作為我的測試例。 #include <stdio.h> #include <stdlib.h> int main() { printf(" Hel

一個JSP程式

我tm爽爆 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head&g

一個c#程式

今天的南昌下雪了,而且下了一天,按這趨勢下來,可能要有十釐米厚了! 好久都沒看過這麼大的雪了,覺得很奇特。但是天氣太冷,一天沒怎麼出去,就在寢室裡呆著,出去吃早餐、玩兩把遊戲、睡覺、點外賣、寫些東西,好像就是一天。真應該認真去外面看看雪。 學習C語言有一個學期了,不得不說,還是學了點東西的[

初學者:一個curses程式為何無法編譯!

你真正需要的不是標頭檔案,而是函式庫,明白嗎? 標頭檔案只不過是“買回來的熱水器的說明書”, 你光拿著說明書,不去找熱水器,能燒開水嗎? RH9 中的 curses.h 就是 libncurses.a 這個熱水器的說明書, 明白這個道理了嗎? gcc 的 -lncurses 這個意思就是說,你要把 libnc

一個JAVA程式

HelloJava.java/*name*/ public class HelloJava { /*定義類HelloJava*/     public static void main(String[ ] args) {     /*定義static(不產生物件就能執行)成員

C++版遺傳演算法求解TSP Java版GA_TSP(一個Java程式

  嗯哼,時隔半年,再次有時間整理關於組合優化問題——旅行商問題(Traveling Salesman Problem, TSP),這次採用的是經典遺傳演算法(Genetic Algorithm, GA)進行求解,利用C++語言進行程式設計實現。關於TSP問題以及GA的簡單介紹,可參見我的另一篇文章:Java

001.python入門之一個python程式筆記

簡單程式截圖: 1.什麼是IDLE?IDLE是一個通過鍵入文字與程式互動的途徑,就像windows的cmd視窗一樣,利用他們可以給作業系統下達命令,我們可以通過IDLE這個shell與python進行互動。 2.為什麼print("hello world"+8)會出錯?python不能

SSIS實踐入門1:一個SSIS程式開發

深圳,和你見面已經有23天的時間了,第10天敲定了我人生中的第三份工作,雖說不是和想象中的工作那麼好,但是我感覺我已經提前進入了備戰狀態,接下來我希望自己在你的領土可以有所發展,深圳,一個人多的城市,一個快節奏的城市.       永遠不要想著讓環境適應你,當你又一次孤身一人

一個c++程式

物件指標陣列演示 1、先準備一個程式編輯環境(新建專案) 我用的是vs2015工具 2、編輯程式碼 #include “stdafx.h” //新增預處理語句 #include using namespace std; //名稱空間 class Test { int n

一個java程式

1、E盤下新建一個資料夾,資料夾裡新建一個記事本檔案,並在該檔案中輸入程式碼: public class HelloWorld{     public static void main(String[]args){         System.out.println("我

一個WCF程式——C#建立WEB SERVER

一、先說幾句   已經好多年沒有使用C#進行應用程式的開發,即使在以前,用C#也只是做些簡單的應用程式而爾。但現在,公司突然將C#的重任交給我,而且還要負責架構部分。無奈只好從C#基本語法學起。但由於要開發三層架構的應用,使用WCF已經是大勢所趨。但找了好多WCF的學

現代OpenGL(一):一個OpenGL程式

OpenGL簡介 OpenGL是一種應用程式程式設計介面(Application Programming Interface,API)它是一種可以對圖形硬體裝置特徵進行訪問的軟體庫。 在OpenGL 3.0以前的版本或者使用相容模式的OpenGL環境,Ope

一個JavaScript程式

<!DOCTYPE html> <html> <head> <title>hello </title> <script type="text/javascript"> alert

一個minigui程式

intMiniGUIMain (int argc, const char* argv[]) //argc:命令列引數個數  argv引數字串陣列指標 {      MSG Msg; //window.h中     HWND hMainWnd;      MAINWINCREATE CreateInfo; //