Java tutorial
/* * Copyright 2016 Google Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.team.formal.eyeshopping; import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.provider.MediaStore; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.GridView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.google.api.client.extensions.android.http.AndroidHttp; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.HttpTransport; import com.google.api.client.json.JsonFactory; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.vision.v1.Vision; import com.google.api.services.vision.v1.VisionRequest; import com.google.api.services.vision.v1.VisionRequestInitializer; import com.google.api.services.vision.v1.model.AnnotateImageRequest; import com.google.api.services.vision.v1.model.BatchAnnotateImagesRequest; import com.google.api.services.vision.v1.model.BatchAnnotateImagesResponse; import com.google.api.services.vision.v1.model.Feature; import com.google.api.services.vision.v1.model.Image; import com.google.api.services.vision.v1.model.WebDetection; import com.google.api.services.vision.v1.model.WebPage; import org.opencv.android.BaseLoaderCallback; import org.opencv.android.LoaderCallbackInterface; import org.opencv.android.OpenCVLoader; import org.opencv.android.Utils; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.imgproc.Imgproc; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserFactory; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.StringReader; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; public class ActivityFindingResults extends AppCompatActivity { private static final String CLOUD_VISION_API_KEY = "AIzaSyCct00PWxWPoXzilFo8BrgeAKawR9OiRZQ"; // input ur key private static final String ANDROID_CERT_HEADER = "X-Android-Cert"; private static final String ANDROID_PACKAGE_HEADER = "X-Android-Package"; private static final String clientID = "vI5pJhlnafXVKt13Z5mF"; private static final String clientSecret = "S60E47pO0M"; private static final String TAG = ActivityFindingResults.class.getSimpleName(); private Bitmap mNaverPrImg; private Mat userSelImg = null; // Grid View GridView gridView; GridViewAdapter gridViewAdapter; ArrayList<Results_GridItem> findingItems = new ArrayList<>(); static { System.loadLibrary("native-lib"); } public native void ConvertRGBtoGray(long matAddrInput, long matAddrResult); public native void CornerHarrisDemo(long addrInputImage, long addrOutput); public native int AkazeFeatureMatching(long userSelImage, long naverPrImage); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_finding_results); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowHomeEnabled(true); gridView = (GridView) findViewById(R.id.list_view); try { // TODO ?? naverPrImgTarget .. url userSelImg = Utils.loadResource(this, R.drawable.user_image, CvType.CV_8UC4); // return BGR // naverPrImg = Utils.loadResource(this, R.drawable.marmont_bag, CvType.CV_8UC4); } catch (IOException e) { e.printStackTrace(); } // made by jaeman Intent intent = getIntent(); String url = intent.getStringExtra("url"); Uri uri = Uri.parse(intent.getStringExtra("uri")); // TextView textView = (TextView) findViewById(R.id.text_view); // String text = "Url : " + url + "\nUri: " + uri.toString(); // textView.setText(text); Bitmap bitmap = null; // get Bitmap image from uri try { bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { callCloudVision(bitmap); } catch (IOException e) { Log.d(TAG, "Image picking failed because " + e.getMessage()); } // end of jaeman TextView t = (TextView) findViewById(R.id.loadingText); t.setVisibility(View.VISIBLE); GridView g = (GridView) findViewById(R.id.list_view); g.setVisibility(View.GONE); } @Override public void onResume() { super.onResume(); if (!OpenCVLoader.initDebug()) { Log.d(TAG, "onResume :: Internal OpenCV library not found."); OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_2_0, this, mLoaderCallback); } else { Log.d(TAG, "onResume :: OpenCV library found inside package. Using it!"); } } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: onBackPressed(); return true; } return super.onOptionsItemSelected(item); } private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { @Override public void onManagerConnected(int status) { switch (status) { case LoaderCallbackInterface.SUCCESS: break; default: { super.onManagerConnected(status); } break; } } }; public Bitmap getBitmapFromURL(String src) { HttpURLConnection connection = null; try { URL url = new URL(src); connection = (HttpURLConnection) url.openConnection(); connection.setDoInput(true); connection.connect(); InputStream input = connection.getInputStream(); BitmapFactory.Options op = new BitmapFactory.Options(); op.inPreferredConfig = Bitmap.Config.ARGB_8888; Bitmap myBitmap = BitmapFactory.decodeStream(input, null, op); return myBitmap; } catch (IOException e) { e.printStackTrace(); return null; } finally { if (connection != null) connection.disconnect(); } } /* , inflate ? */ private class GridViewAdapter extends BaseAdapter { Context context; ArrayList<ActivityFindingResults.Results_GridItem> gridItems; private GridViewAdapter(Context context, ArrayList<ActivityFindingResults.Results_GridItem> gridItems) { this.context = context; this.gridItems = gridItems; } public int getCount() { return gridItems.size(); } public ActivityFindingResults.Results_GridItem getItem(int position) { return gridItems.get(position); } public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { ActivityFindingResults.Results_GridView gridView; if (convertView == null) { gridView = new ActivityFindingResults.Results_GridView(this.context, this.gridItems.get(position)); } else { gridView = (ActivityFindingResults.Results_GridView) convertView; } return gridView; } } /* ? ? */ class Results_GridItem { private Bitmap thumb; private String productName; private String price; private int int_price; private String url; private ArrayList<String> keywords; private String combinationKeyword; private String thumbUrl; public Results_GridItem(String productName, Bitmap thumb, String price, int int_price, String url, ArrayList<String> keywords, String combinationKeyword, String thumbUrl) { this.thumb = thumb; this.productName = productName; this.price = price; this.int_price = int_price; this.url = url; this.keywords = keywords; this.combinationKeyword = combinationKeyword; this.thumbUrl = thumbUrl; } public int getPrice() { return this.int_price; } public String getPriceText() { return this.price; } public Bitmap getThumb() { return this.thumb; } public String getProductName() { return this.productName; } public String getUrl() { return this.url; } public ArrayList<String> getKeywords() { return this.keywords; } public String getCombinationKeyword() { return this.combinationKeyword; } public String getThumbUrl() { return this.thumbUrl; } // public String keyworkd } /* , xml ? ? ? */ class Results_GridView extends LinearLayout { private ViewGroup vGroup; private ImageView thumbView; private TextView productNameView; private TextView priceView; public Results_GridView(Context context, final ActivityFindingResults.Results_GridItem aItem) { super(context); LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.grid_list_item, this, true); vGroup = (ViewGroup) findViewById(R.id.grid_item_frame_layout2); thumbView = (ImageView) findViewById(R.id.product_thumbnail); productNameView = (TextView) findViewById(R.id.product_name); priceView = (TextView) findViewById(R.id.product_price); thumbView.setImageBitmap(aItem.getThumb()); productNameView.setText(aItem.getProductName()); priceView.setText(aItem.getPriceText()); vGroup.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { final Intent intent = new Intent(getApplicationContext(), ActivityFindingsResultsSelect.class); //searchDate ActivityFindingsResultsSelect ViewGroup vg = (ViewGroup) v; thumbView = (ImageView) vg.findViewById(R.id.product_thumbnail); productNameView = (TextView) vg.findViewById(R.id.product_name); priceView = (TextView) vg.findViewById(R.id.product_price); intent.putExtra("product_thumbnail", aItem.getThumb()); intent.putExtra("product_name", aItem.getProductName()); intent.putExtra("product_price", aItem.getPriceText()); intent.putExtra("product_url", aItem.getUrl()); insertAllAboutProduct(aItem); startActivityForResult(intent, 1777); } }); } } // made by jaeman private void callCloudVision(final Bitmap bitmap) throws IOException { // Do the real work in an async task, because we need to use the network anyway new AsyncTask<Object, Void, ArrayList<String>>() { final ProgressDialog asyncDialog = new ProgressDialog(ActivityFindingResults.this); @Override protected void onPreExecute() { super.onPreExecute(); asyncDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); asyncDialog.setMessage("Loading Products ..."); asyncDialog.show(); } @Override protected ArrayList<String> doInBackground(Object... params) { try { HttpTransport httpTransport = AndroidHttp.newCompatibleTransport(); JsonFactory jsonFactory = GsonFactory.getDefaultInstance(); VisionRequestInitializer requestInitializer = new VisionRequestInitializer( CLOUD_VISION_API_KEY) { /** * We override this so we can inject important identifying fields into the HTTP * headers. This enables use of a restricted cloud platform API key. */ @Override protected void initializeVisionRequest(VisionRequest<?> visionRequest) throws IOException { super.initializeVisionRequest(visionRequest); String packageName = getPackageName(); visionRequest.getRequestHeaders().set(ANDROID_PACKAGE_HEADER, packageName); String sig = PackageManagerUtils.getSignature(getPackageManager(), packageName); visionRequest.getRequestHeaders().set(ANDROID_CERT_HEADER, sig); } }; Vision.Builder builder = new Vision.Builder(httpTransport, jsonFactory, null); builder.setVisionRequestInitializer(requestInitializer); Vision vision = builder.build(); BatchAnnotateImagesRequest batchAnnotateImagesRequest = new BatchAnnotateImagesRequest(); batchAnnotateImagesRequest.setRequests(new ArrayList<AnnotateImageRequest>() { { AnnotateImageRequest annotateImageRequest = new AnnotateImageRequest(); // Add the image Image base64EncodedImage = new Image(); // Convert the bitmap to a JPEG // Just in case it's a format that Android understands but Cloud Vision ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 90, byteArrayOutputStream); byte[] imageBytes = byteArrayOutputStream.toByteArray(); // Base64 encode the JPEG base64EncodedImage.encodeContent(imageBytes); annotateImageRequest.setImage(base64EncodedImage); // add the features we want annotateImageRequest.setFeatures(new ArrayList<Feature>() { { Feature webDetection = new Feature(); webDetection.setType("WEB_DETECTION"); webDetection.setMaxResults(20); add(webDetection); } }); // Add the list of one thing to the request add(annotateImageRequest); } }); Vision.Images.Annotate annotateRequest = vision.images().annotate(batchAnnotateImagesRequest); // Due to a bug: requests to Vision API containing large images fail when GZipped. annotateRequest.setDisableGZipContent(true); Log.d(TAG, "created Cloud Vision request object, sending request"); BatchAnnotateImagesResponse response = annotateRequest.execute(); return convertResponseToString(response); } catch (GoogleJsonResponseException e) { Log.d(TAG, "failed to make API request because " + e.getContent()); } catch (IOException e) { Log.d(TAG, "failed to make API request because of other IOException " + e.getMessage()); } return null; } @Override protected void onPostExecute(ArrayList<String> urls) { super.onPostExecute(urls); // urls . for (int i = 0; i < urls.size(); i++) { Log.d("pages", urls.get(i)); } ArrayList<String[]> parsedUrl = urlParsing(urls); Map<String, Integer> map = new HashMap<String, Integer>(); // 1. url / _- for (int i = 0; i < parsedUrl.size(); i++) { for (int j = 0; j < parsedUrl.get(i).length; j++) { System.out.println(parsedUrl.get(i)[j]); Integer count = map.get(parsedUrl.get(i)[j]); map.put(parsedUrl.get(i)[j], (count == null) ? 1 : count + 1); } System.out.println(""); } // , keyword // . // naver Shop api ArrayList<String> rankCount = new ArrayList<>(); ArrayList<ArrayList<String>> resultArr = new ArrayList<ArrayList<String>>(); for (Map.Entry<String, Integer> entry : map.entrySet()) { if (entry.getValue() >= 4) { System.out.println("keyword : " + entry.getKey() + " Count : " + entry.getValue()); rankCount.add(entry.getKey()); } } final ArrayList<String> coreKeywords = new ArrayList<>(); if (!rankCount.isEmpty()) { for (int k = 0; k < 7; k++) { int randomCount = randomRange(1, rankCount.size()); boolean checkDuplicate[] = new boolean[rankCount.size()]; String combiw = ""; for (int i = 0; i < randomCount; i++) { int rand1; while (checkDuplicate[(rand1 = randomRange(0, rankCount.size() - 1))]) { } combiw += rankCount.get(rand1) + "%20"; Log.d("combi", combiw); checkDuplicate[rand1] = true; } coreKeywords.add(combiw); } for (int i = 0; i < coreKeywords.size(); i++) { Log.d("coreKey", coreKeywords.get(i)); } // for (String arr[] : parsedUrl) { // int count = 0; // boolean check[] = new boolean[arr.length]; // ArrayList<String> strArr = new ArrayList<>(); // // for (int i = 0; i < arr.length; i++) { // for (String rank : rankCount) { // if (arr[i].equals(rank)) { // check[i] = true; // strArr.add(arr[i]); // count++; // } // } // Log.d("strArr", strArr.toString()); // } // // int rand; // int randSize = randomRange(1, arr.length - count); // for (int i = 0; i < randSize; i++) { // while (check[(rand = randomRange(0, arr.length - 1))]) { // } // strArr.add(arr[rand]); // check[rand] = true; // } // resultArr.add(strArr); // Log.d("raa", resultArr.toString()); // } } // end of isEmpty() new AsyncTask<Object, Void, List<Shop>>() { @Override protected List<Shop> doInBackground(Object... params) { List<Shop> results = new ArrayList<>(); if (results.size() > 5) results = results.subList(0, 5); for (int i = 0; i < coreKeywords.size(); i++) { System.out.println(coreKeywords.get(i).toString().replaceAll(", ", "%20")); Log.d("uri", coreKeywords.get(i).toString().replaceAll(", ", "%20")); final String xmlRaw = coreKeywords.get(i).toString().replaceAll(", ", "%20"); // 1 URL url = null; try { url = new URL("https://openapi.naver.com/v1/search/shop.xml?query=" + xmlRaw + "&display=50"); } catch (MalformedURLException e) { e.printStackTrace(); } HttpURLConnection urlConnection = null; try { urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setRequestProperty("X-Naver-Client-ID", clientID); urlConnection.setRequestProperty("X-Naver-Client-Secret", clientSecret); urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 ( compatible ) "); urlConnection.setRequestProperty("Accept", "*/*"); } catch (IOException e) { e.printStackTrace(); } InputStream in = null; try { in = new BufferedInputStream(urlConnection.getInputStream()); } catch (IOException e) { e.printStackTrace(); } String data = ""; String msg = null; BufferedReader br = null; try { if (in != null) { br = new BufferedReader(new InputStreamReader(in, "UTF-8")); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } try { if (br != null) { while ((msg = br.readLine()) != null) { data += msg; } } } catch (IOException e) { e.printStackTrace(); } Log.i("msg of br: ", data); // 2 String shopResult = data; try { List<Shop> parsingResult = parsingShopResultXml(shopResult); if (parsingResult.size() > 5) parsingResult = parsingResult.subList(0, 5); for (final Shop shop : parsingResult) { Bitmap thumbImg = getBitmapFromURL(shop.getImage()); if (thumbImg != null) { ArrayList<String> keywords = new ArrayList<>(Arrays.asList(coreKeywords .get(i).replace("[", "").replace("]", "").split("%20"))); String combinationKeyword = coreKeywords.get(i).replace("[", "") .replace("]", "").replaceAll("%20", " "); shop.setThumbBmp(thumbImg); // ? Url shop.setCombinationKeyword(combinationKeyword); shop.setKeywords(keywords); results.add(shop); } } if (results.size() > 10) // must be results = results.subList(0, 10); for (Shop dummyShop : results) { mNaverPrImg = dummyShop.getThumbBmp(); Mat userSelImgTarget = new Mat(userSelImg.width(), userSelImg.height(), CvType.CV_8UC4); Mat naverPrImgTarget = new Mat(mNaverPrImg.getWidth(), mNaverPrImg.getHeight(), CvType.CV_8UC4); Utils.bitmapToMat(mNaverPrImg, naverPrImgTarget); Imgproc.cvtColor(userSelImg, userSelImgTarget, Imgproc.COLOR_BGR2RGB); Imgproc.cvtColor(naverPrImgTarget, naverPrImgTarget, Imgproc.COLOR_RGBA2RGB); int ret = AkazeFeatureMatching(userSelImg.getNativeObjAddr(), naverPrImgTarget.getNativeObjAddr()); if (ret == 1) { // find one! DecimalFormat df = new DecimalFormat("#,###"); String num = df.format(dummyShop.getLprice()); int exist_flag = 0; for (int ii = 0; ii < findingItems.size(); ii++) { if (findingItems.get(ii).getProductName() .equals(dummyShop.getTitle())) { exist_flag = 1; break; } } if (exist_flag == 0) { findingItems.add(new Results_GridItem(dummyShop.getTitle(), mNaverPrImg, " " + num + "?", dummyShop.getLprice(), dummyShop.getLink(), dummyShop.getKeywords(), dummyShop.getCombinationKeyword(), dummyShop.getImage())); } } } } catch (Exception e) { e.printStackTrace(); } } // end of for return results; } // end of doinbackground @Override protected void onPostExecute(List<Shop> shops) { super.onPostExecute(shops); TextView t = (TextView) findViewById(R.id.loadingText); t.setVisibility(View.GONE); GridView g = (GridView) findViewById(R.id.list_view); g.setVisibility(View.VISIBLE); if (findingItems.size() == 0) { TextView tLoad = (TextView) findViewById(R.id.loadingText); tLoad.setText(" ."); tLoad.setVisibility(View.VISIBLE); gridView.setVisibility(View.GONE); } else { Log.d(TAG, "finding Size!!!!" + Integer.toString(findingItems.size())); Collections.sort(findingItems, new Comparator<Results_GridItem>() { @Override public int compare(Results_GridItem o1, Results_GridItem o2) { if (o1.getPrice() > o2.getPrice()) { return 1; } else if (o1.getPrice() < o2.getPrice()) { return -1; } else { return 0; } } }); for (int i = 0; i < findingItems.size(); i++) { Log.d(TAG, "List !! " + Integer.toString(findingItems.get(i).getPrice())); } Log.d(TAG, "finding Size!!!!" + Integer.toString(findingItems.size())); gridViewAdapter = new GridViewAdapter(getApplicationContext(), findingItems); gridView.setAdapter(gridViewAdapter); } asyncDialog.dismiss(); } }.execute(); } // end of PostExcute }.execute(); } private ArrayList<String> convertResponseToString(BatchAnnotateImagesResponse response) { ArrayList<String> urls = new ArrayList<>(); String url = ""; WebDetection annotation = response.getResponses().get(0).getWebDetection(); if (annotation != null) { for (WebPage page : annotation.getPagesWithMatchingImages()) { url = String.format(Locale.KOREAN, "%s", page.getUrl()); urls.add(url); } } return urls; } public ArrayList<String[]> urlParsing(ArrayList<String> urls) { ArrayList<Integer> lastIndex = new ArrayList<Integer>(); ArrayList<String> tokenList = new ArrayList<String>(); ArrayList<String[]> keywordList = new ArrayList<String[]>(); // ? "/" for (int i = 0; i < urls.size(); i++) { lastIndex.add(urls.get(i).lastIndexOf("/")); } for (int i = 0; i < urls.size(); i++) { tokenList.add(urls.get(i).substring(lastIndex.get(i) + 1, urls.get(i).length())); // System.out.println(tokenList); } // ? ? _- ... for (int i = 0; i < tokenList.size(); i++) { keywordList.add(tokenList.get(i).replace(".html", "").replace(".php", "").split("[-_]")); } return keywordList; } public static int randomRange(int n1, int n2) { return (int) (Math.random() * (n2 - n1 + 1)) + n1; } // xml ? public List<Shop> parsingShopResultXml(String data) throws Exception { XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlPullParser parser = factory.newPullParser(); // List<Shop> list = null; parser.setInput(new StringReader(data)); int eventType = parser.getEventType(); Shop b = null; while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_DOCUMENT: list = new ArrayList<Shop>(); break; case XmlPullParser.END_DOCUMENT:// break; case XmlPullParser.START_TAG: { // String tag = parser.getName(); switch (tag) { case "item": // item b = new Shop(); break; case "title": if (b != null) { b.setTitle(RemoveHTMLTag(parser.nextText())); } break; case "link": if (b != null) b.setLink(parser.nextText()); break; case "image": if (b != null) b.setImage(parser.nextText() + "?type=f140"); break; case "total": if (b != null) b.setTotal(parser.next()); break; case "lprice": if (b != null) b.setLprice(Integer.parseInt(parser.nextText())); case "hprice": if (b != null) b.setHprice(parser.next()); break; } break; } case XmlPullParser.END_TAG: { String tag = parser.getName(); if (tag.equals("item")) { list.add(b); b = null; } } } eventType = parser.next(); } return list; } // end of jaeman public String RemoveHTMLTag(String changeStr) { if (changeStr != null && !changeStr.equals("")) { changeStr = changeStr.replaceAll("<(/)?([a-zA-Z]*)(\\s[a-zA-Z]*=[^>]*)?(\\s)*(/)?>", ""); } else { changeStr = ""; } return changeStr; } public void insertAllAboutProduct(Results_GridItem aItem) { String cKey = aItem.getCombinationKeyword(); ArrayList<String> keys = aItem.getKeywords(); Log.i("cKey", cKey); Log.i("keys", keys.toString()); MainActivity.DBInstance.insertMatchingCombinationLocal(cKey, aItem.getThumbUrl()); MainActivity.DBInstance.insertSearchedProduct(cKey, (new Date()).getTime(), 0, aItem.getThumbUrl(), aItem.getPrice(), aItem.getUrl()); for (int i = 0; i < aItem.getKeywords().size(); i++) { MainActivity.DBInstance.insertKeywordCountLocal(keys.get(i), 0); MainActivity.DBInstance.insertKeywordInCombinationLocal(keys.get(i), cKey); } String[] params = new String[2]; try { params[0] = cKey; params[1] = aItem.getThumbUrl(); MainActivity.DBInstance.insertIntoServerTable("matching_combination", params); Thread.sleep(800); params[1] = "0"; for (int i = 0; i < aItem.getKeywords().size(); i++) { params[0] = keys.get(i); MainActivity.DBInstance.insertIntoServerTable("keyword_count", params); Thread.sleep(800); } params[0] = cKey; for (int i = 0; i < aItem.getKeywords().size(); i++) { params[1] = keys.get(i); MainActivity.DBInstance.insertIntoServerTable("keyword_in_combination", params); Thread.sleep(800); } } catch (IOException | InterruptedException e) { e.printStackTrace(); } } }