マイムの部屋

社内SEが,興味をもったことを書いていきます.

Androidアプリにおける非同期のHTTP通信

今回は,Androidアプリにおける非同期のHTTP通信を行うコードを載せます.

私は,今(2014/08)からAndroidアプリを作ろうと思ったので,違和感がなかったのですが.
非同期を行わなければならない仕様になったそうです.
仕様が変わるのはめんどくさいですね.
そんなことはさておき,以下に私が書いたコードを載せます.

  • mainactivity.javaソースコード
  • import android.os.Bundle;
    import android.support.v7.app.ActionBarActivity;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.TextView;
    
    public class MainActivity extends ActionBarActivity {
    
     @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            AsyncHttpRequest task = new AsyncHttpRequest(this); 
            // 非同期開始
            task.execute("指定URL");
        }
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		// Inflate the menu; this adds items to the action bar if it is present.
    		getMenuInflater().inflate(R.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();
    		if (id == R.id.action_settings) {
    			return true;
    		}
    		return super.onOptionsItemSelected(item);
    	}
    }
    
    --------------------------------------
  • AsyncHttpRequest.javaソースコード
  • import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.URL;
    import java.net.URLConnection;
    import java.util.ArrayList;
    
    import android.app.Activity;
    import android.os.AsyncTask;
    import android.util.Log;
    import android.widget.TextView;
    
    import com.fasterxml.jackson.core.JsonFactory;
    import com.fasterxml.jackson.core.JsonParseException;
    import com.fasterxml.jackson.core.JsonParser;
    import com.fasterxml.jackson.core.JsonToken;
    
    public class AsyncHttpRequest extends AsyncTask {
    	// Activity オブジェクト生成
    	private Activity mainActivity;
    	
    	public AsyncHttpRequest(Activity activity){
    		// 呼び出し元のアクティビティ
    		this.mainActivity = activity;
    	}
    	@Override
    	protected String doInBackground(String... strURL) {
    		 // (1)try-catchによるエラー処理
    	    try {
    	        // (2)URLクラスを使用して通信を行う
    	        URL url = new URL(strURL[0]);
    	        URLConnection connection = url.openConnection();
    	        // 動作を入力に設定
    	        connection.setDoInput(true);
    	        InputStream stream = connection.getInputStream();
    	        BufferedReader input = new BufferedReader(new InputStreamReader(
    		    stream));
    	    
    	        // (3)データの取得
    	        String data = "";
    	        String tmp = "";
    	        while ((tmp = input.readLine()) != null) {
    	            data += tmp;
    	        }
    	        // (4)終了処理
    	        stream.close();
    	        input.close();
    	        return data;
    	    } catch (Exception e) {
    	        // (5)エラー処理
    	        return e.toString();
    	    }
    	}
    	
    	
    	protected void onPostExecute(String result){
    		TextView tv = (TextView) mainActivity.findViewById(R.id.view);
    		JsonFactory factory = new JsonFactory();	        
    		try {
    			JsonParser parser = factory.createParser(result);
    			ArrayList title = new ArrayList();
    			int i = 0;
    		while (parser.nextToken() != JsonToken.END_OBJECT) {
    			while (parser.nextToken() != JsonToken.END_OBJECT) {
    		        String name = parser.getCurrentName();		
    		        if(name != null){
    		        	parser.nextToken();
    		        	Log.d("name",name);
    		        	if(name.equals("title")){
    		        	  title.add(parser.getText());	
    		        	}
    		        }
    		    }
    		}
    		String titles = "";
    		for(i=0;i<title.size();i++){
    	       titles = titles + "title:" + title.get(i) + "\n";		
    		}
    		   tv.setText(titles);
    		} catch (JsonParseException e) {
    			// TODO 自動生成された catch ブロック
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO 自動生成された catch ブロック
    			e.printStackTrace();
    		}
    	//tv.setText(result);
    	}
    }
    
    注:jackson という json ファイルを取り扱うライブラリを一部使用しています.