我正在编写一个用于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已正确更新。
那我错过了什么?