0

サーバーからクライアントに情報請求書をロードしたいのですが、ロード中にプロセスダイアログが表示されないため、ロードがいつ完了するかわかりません。手伝って頂けますか?または、ロードプロセスでダイアログを表示する方法はありますか?ガイドしてください!

コードcallUrl

public class CallUrl extends AsyncTask<String, Integer, String> {

public static final int POST_TASK = 1;
public static final int GET_TASK = 2;         
private static final String TAG = "WebServiceTask";
// thời gian chờ của một kết nối, tính theo milliseconds (waiting to connect)
private static final int CONN_TIMEOUT = 3000; 
// thời gian chờ của một socket, tính bằng milliseconds (waiting for data)
private static final int SOCKET_TIMEOUT = 5000;   
private int taskType = GET_TASK;
private Context mContext = null;
private String processMessage = "Processing...";
private ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
private ProgressDialog pDlg = null;

//Khởi tạo
public CallUrl(int taskType, Context mContext, String processMessage) {

    this.taskType = taskType;
    this.mContext = mContext;
    this.processMessage = processMessage;
}

@Override
protected void onPostExecute(String result) {
    pDlg.dismiss();
}

//thêm thông tin cần thiết để gửi lên server 
public void addNameValuePair(String name, String value) {

    params.add(new BasicNameValuePair(name, value));
}

//Hiển thị dialog trong quá trình load data
private void showProgressDialog() {

    pDlg = new ProgressDialog(mContext);
    pDlg.setMessage(processMessage);
    pDlg.setProgressDrawable(mContext.getWallpaper());
    pDlg.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    pDlg.setCancelable(false);
    pDlg.show();
}

@Override
protected void onPreExecute() {

    showProgressDialog();
}

//kết nối đến server thông url
protected String doInBackground(String... urls) {
    String url = urls[0];
    String result = "";
    HttpResponse response = doResponse(url);
    if (response == null) {
        return result;
    } else {
        try {

            result = inputStreamToString(response.getEntity().getContent());

        } catch (IllegalStateException e) {
            Log.e(TAG, e.getLocalizedMessage(), e);

        } catch (IOException e) {
            Log.e(TAG, e.getLocalizedMessage(), e);
        }
    }
    return result;
}

// khởi tạo socket và kết nối
private HttpParams getHttpParams() {

    HttpParams htpp = new BasicHttpParams();   
    HttpConnectionParams.setConnectionTimeout(htpp, CONN_TIMEOUT);
    HttpConnectionParams.setSoTimeout(htpp, SOCKET_TIMEOUT); 
    return htpp;
}

//thao tác xử lý khi kết nối đến server 
private HttpResponse doResponse(String url) {

    HttpClient httpclient = new DefaultHttpClient(getHttpParams());
    HttpResponse response = null;

    try {
        switch (taskType) {

        case POST_TASK:
            HttpPost httppost = new HttpPost(url);
            // Add parameters
            httppost.setEntity(new UrlEncodedFormEntity(params));
            response = httpclient.execute(httppost);
            break;
        case GET_TASK:
            HttpGet httpget = new HttpGet(url);
            response = httpclient.execute(httpget);
            break;
        }
    } catch (Exception e) {

        Log.e(TAG, e.getLocalizedMessage(), e);

    }

    return response;
}

//Chuyển thông tin nhận về thành dạng chuỗi
private String inputStreamToString(InputStream is) {

    String line = "";
    StringBuilder total = new StringBuilder();
    BufferedReader rd = new BufferedReader(new InputStreamReader(is));
    try {
        // đọc thông tin nhận được cho đến khi kết thúc
        while ((line = rd.readLine()) != null) {
            total.append(line);
        }
    } catch (IOException e) {
        Log.e(TAG, e.getLocalizedMessage(), e);
    }

    // Trả về giá trị chuỗi đầy đủ
    return total.toString();
}

}

メインコード

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.invoice);
    doTimerTask();

    }
  public void doTimerTask() {
    TimerTask mTimerTask;
    Timer t = new Timer();
    final Handler handler = new Handler();
    mTimerTask = new TimerTask() {
        public void run() {
            handler.post(new Runnable() {
                public void run() {
                    testNetwork();
                    Log.d("TIMER", "TimerTask run");
                }
            });
        }
    };
    // public void schedule (TimerTask task, long delay, long period)
    t.schedule(mTimerTask, 500, 300000); //
}
  public void testNetwork()
{
    // Kiểm tra kết nối đến server
    TestConnectionNew test = new TestConnectionNew();
    try {
        String recieve = test.execute("http://longvansolution.tk/monthlytarget.php").get();
        if (recieve.equalsIgnoreCase("true") && isNetworkAvailable() == true)
        {
            loaddata();
        }
        else if (recieve.equalsIgnoreCase("false") || isNetworkAvailable() == false)
        {
            String mess = "Không thể kết nối đến server hoặc thiết bị chưa có kết nối mạng!";
            Toast.makeText(Invoice.this, mess, Toast.LENGTH_SHORT).show();
        }

    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
}
  public void workoffline()
{
    clearArray();
    try {
        mDb.openDB();
        Cursor mCursor = mDb.getAllInvoice(IDDelivery);
        if (mCursor.moveToFirst()) {
            do {
                codeInvoiceArray.add(mCursor.getString(1));
                nameArray.add(mCursor.getString(2));
                phonenumberArray.add(mCursor.getString(3));
                addressArray.add(mCursor.getString(4));
                urlArray.add(mCursor.getString(5));

            } while (mCursor.moveToNext());
            loaddatalistview();
        }
        mDb.closeDB();
    } catch (Exception e) {
        e.printStackTrace();
    }

}

// lấy dữ liệu từ server về thiết bị
public void loaddata()
{
    String phonenumber, name, address, url, code;
    JSONArray jArray;
    try
    {
        clearArray();
        String sampleURL = SERVICE_URL + "/monthlytarget.php";
        CallUrl wst = new CallUrl(CallUrl.GET_TASK, this, "Lấy thông tin hóa đơn...");
        String result = wst.execute(new String[] {
                sampleURL
        }).get();

        if (result.equalsIgnoreCase(""))
        {
            notification("Hôm nay không còn gì để giao!");
        }
        else
        {
            JSONObject json_data = null;
            JSONObject jsonObject = new JSONObject(result);
            jArray = jsonObject.getJSONArray("Orders");
            // Mở kết nối đến database
            mDb.openDB();

            // sử dụng json lấy các giá trị thông qua các key
            // gán nó vào các mảng tương ứng
            for (int i = 0; i < jArray.length(); i++) {
                json_data = jArray.getJSONObject(i);

                // Lây thông tin theo mã id của người giao hàng
                if (json_data.getString("DeliveryId").equalsIgnoreCase(IDDelivery))
                {
                    phonenumber = json_data.getString("PhoneNumber");
                    address = json_data.getString("Address");
                    name = json_data.getString("CustomerName");
                    url = json_data.getString("Url");
                    code = json_data.getString("CodeInvoice");
                    save(code, url);
                    // Kiểm tra mã hóa đơn này đã có trong database chưa
                    // nếu chưa sẽ thêm data vào databse
                    // nếu đã có rồi sẽ cập nhật lại thông tin thông qua mã
                    // hóa đơn
                    if (mDb.test(code) == true)
                    {
                        mDb.insert(code, name, phonenumber, address, url, "PACKED",
                                IDDelivery);
                    }
                    else
                    {
                        mDb.editAll(code, name, phonenumber, address, url, IDDelivery, "PACKED");

                    }
                }
            }
            // Thực hiện xong, đóng kết nối
            mDb.closeDB();
        }
    } catch (Exception e)
    {
        e.printStackTrace();
    }
    // Hiển thị thông tin nhận được lên listview
    workoffline();
}
4

1 に答える 1

1

ここ :

String sampleURL = SERVICE_URL + "/monthlytarget.php";
CallUrl wst = new CallUrl(CallUrl.GET_TASK, this, "Lấy thông tin hóa đơn...");
String result = wst.execute(new String[] {
        sampleURL
}).get();    //<<<<<<<<<<you are using execute().get()

AsyncTask からデータを取得するためにAsyncTask.get()を使用しています。これは、doc が示すように結果が取得されなくなるまでメソッドが UI スレッドの実行をブロックするためです。CallUrlget()AsyncTask

必要に応じて計算が完了するまで待機し、その結果を取得します。

したがって、UI スレッドのブロックを回避し、アラートボックスを表示するには、次のように実行する必要がありますCallUrl

String sampleURL = SERVICE_URL + "/monthlytarget.php";
CallUrl wst = new CallUrl(CallUrl.GET_TASK, Invoice.this, 
                                          "Lấy thông tin hóa đơn...");
wst.execute(new String[] {
        sampleURL
});   

実行完了onPostExecute時にUIを更新するために使用しますdoInBackground

于 2012-12-20T03:16:48.737 に答える