LoopJ AndroidAsyncHttp和BarcodeScanner(ZXing)

时间:2014-05-23 19:55:22

标签: android android-intent android-fragments barcode-scanner android-context

我正在编写一个用于Web服务的Android应用程序,也是由我编写的。 基本上我在使用ZXing和LoopJ AndroidAsyncHttp提供的条形码扫描器应用程序时遇到了烦人的问题。这个想法应该很简单:当我点击按钮时,BarcodeScanner就会启动。扫描完成后,结果将发送到名为 checkBarcode 的函数,以检查通过AsyncHttpClient.get()到达的服务器是否包含条形码。 这是我的代码:

package it.polito.ai.project.fragment;

import java.util.ArrayList;
import java.util.Calendar;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.simple.*;

import com.loopj.android.http.*;

import it.polito.ai.project.andoidside.R;
import it.polito.ai.project.main.MainActivity;
import android.app.Fragment;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.webkit.WebView.FindListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import com.google.zxing.integration.android.*;

public class InserisciUnProdottoFragment extends Fragment{

    private ImageButton ib_scan;
    private EditText et_descrizione, et_barcode;
    private View rootView;
    private AsyncHttpClient client;

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        rootView = inflater.inflate(R.layout.fragment_inserisci_un_prodotto, container, false);

        ib_scan         = (ImageButton) rootView.findViewById(R.id.ip_ib_scan);
        btn_inserisci   = (Button) rootView.findViewById(R.id.ip_btn_inserisci);
        et_barcode      = (EditText) rootView.findViewById(R.id.ip_et_barcode);
        et_descrizione  = (EditText) rootView.findViewById(R.id.ip_et_descrizione);

        client = new AsyncHttpClient();

        addListeners();

        return rootView;
    }

    private void addListeners() {
        ib_scan.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    IntentIntegrator integrator = new IntentIntegrator(InserisciUnProdottoFragment.this);
                    integrator.initiateScan();

                } catch (Exception e) {
                    e.printStackTrace();

                }

            }
        });

        ...
        ...
        ...
    }

    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        Log.v("DEBUG", "onActivityResult");
        IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
        if(scanResult != null) {
            et_barcode.setText(""+scanResult.getContents());
            checkBarcode(scanResult.getContents());
        }
    }

    private void checkBarcode(String barcode) {

        client.get("http://192.168.1.2:8080/supermarket/android/inserzione/checkbarcode/" + barcode, new JsonHttpResponseHandler(){
            @Override
            public void onSuccess(JSONArray response) {
                updateGui(response);
            }

            @Override
            public void onFailure(Throwable error, String content) {
                Log.v("ERROR" , "onFailure error : " + error.toString() + "content : " + content);
                // ..error handling..
            }

        });
    }

    private void updateGui(JSONArray response) {
        JSONObject jsonObj = null;
        try {
            jsonObj = response.getJSONObject(0);
            EditText tmp = (EditText) rootView.findViewById(R.id.ip_et_descrizione);
            if(jsonObj.getBoolean("found")) {       // barcode found!
                tmp.setText(jsonObj.getString("description")); 
            }
            else {  // barcode not found!
                tmp.setText("no description");
            }

        } catch (JSONException e) {

            e.printStackTrace();
        }
    }
}

所以问题是,当AsyncHttpClient onSuccess()返回时,我想在GUI中修改一些内容,例如"描述" TextView中。但它没有正常工作。这就像onSuccess永远不会被调用。

顺便说一句,如果我让 checkBarcode 在片段的onCreate()中传递一个字符串,那么"描述" TextView已正确更新。

那我错过了什么?

0 个答案:

没有答案