1

Androidアプリで、アクティビティを開始すると、黒い画面またはアプリケーションが数秒間表示されたままになります。黒い画面までプログレスバーを表示したい。何度も試しましたが、できませんでした。

String xml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" 
                + "<category><Id>" + catId + "</Id></category>";
StringBuilder resXML = new Connection().getResponseString("http://192.168.1.14/virtualMirror/productlisting.php", xml); // TODO URL change
if(!resXML.equals("")) {
    XMLParser parser = new XMLParser();
    Document doc = parser.getDomElement(resXML.toString()); // getting DOM element
    NodeList nodeList = doc.getElementsByTagName("Product");

    Intent intent = new Intent(this, ProductListing.class);
    Bundle bundle = new Bundle();
    bundle.putLong("CategoryId", catId);
    bundle.putString("CategoryName", catName);
    intent.putExtras(bundle);
    startActivity(intent);
}
4

2 に答える 2

1

AsyncTaskを使用します。

AsyncTaskを使用すると、UIスレッドを適切かつ簡単に使用できます。このクラスを使用すると、スレッドやハンドラーを操作しなくても、バックグラウンド操作を実行してUIスレッドで結果を公開できます。

AsyncTaskはdoInBackground()、ビューがあるGUIにアクセスできない別のスレッド内ですべてを実行します。

preExecute()またpostExecute()、この新しいスレッドで重い作業が発生する前後にGUIにアクセスできるようにするために、長い操作の結果をpostExecute()に渡して、処理の結果を表示することもできます。

class LoadCategory extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        Pd = new ProgressDialog(getApplicationContext());
        Pd.show();
    }

    @Override
    protected Void doInBackground(Void... params) {
        String xml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>"
                + "<category><Id>" + catId + "</Id></category>";

        StringBuilder resXML = new Connection().getResponseString("http://192.168.1.14/virtualMirror/productlisting.php",xml); // TODO URL change
        if (!resXML.equals("")) {
            XMLParser parser = new XMLParser();
            Document doc = parser.getDomElement(resXML.toString());
            NodeList nodeList = doc.getElementsByTagName("Product");
            return null;
        }
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        Pd.dismiss();
        Intent intent = new Intent(this, ProductListing.class);
        Bundle bundle = new Bundle();
        bundle.putLong("CategoryId", catId);
        bundle.putString("CategoryName", catName);
        intent.putExtras(bundle);
        startActivity(intent);
    }
}

そして、このクラスをonCreate()メソッドで使用します。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    new LoadCategory().execute();
}
于 2012-10-05T11:49:14.587 に答える
0

最初にプログレスバーのある画面をロードし、新しいスレッドを使用してこのコードを呼び出す必要があります。そのために、スレッドクラスを拡張する新しいクラスを作成し、runメソッドをオーバーライドできます。値がロードされたという通知を受け取るには、メッセージを使用する必要があります。

これは簡単で汚い例ですが、全体的な流れを理解するには希望で十分です。

private final Handler handler = new Handler(){
        public void handleMessage(Message msg)
        {
            int total = msg.getData().getInt("total");
            if (total <= 0)
            {
            //Handle the response here
            } 
        }
    };

    private class yourclassname extends Thread{
        Handler mHandler;
        String _serviceUrl;
        CarpoolCancellationLoader(Handler h,String serviceUrl)
        {
            mHandler = h;
            _serviceUrl = serviceUrl;

        }

        private class SerializableClassName 
        {
        ..Put your serializable data here
        }

        @Override
        public void run()
        {
            cancelResponse = runJSONParser();
            //Send the thread activity done message to the handler
            Message msg = mHandler.obtainMessage();
            Bundle b = new Bundle();
            b.putInt("total", -1);
            msg.setData(b);
            mHandler.sendMessage(msg);

        }

          public YourResponseType runJSONParser()
          {
              try
              {
                //Perform your loading operation here
              }
              catch(Exception ex)
            {
                throw ex;
            }
          }

          public String convertStreamToString(InputStream is)
          {
              BufferedReader reader = new BufferedReader(new InputStreamReader(is));
              StringBuilder sb = new StringBuilder();

              String line = null;

              try
              {
                  while ((line = reader.readLine()) != null)
                  {
                      sb.append(line + "\n");
                  }
              }
              catch (IOException e)
              {
                  e.printStackTrace();
              }
              finally
              {
                  try
                  {
                      is.close();
                  }
                  catch (IOException e)
                  {
                      e.printStackTrace();
                  }
              }

              return sb.toString();
          }
    }

これはかなりクリーンなコードではありませんが、新しいスレッドを作成し、非同期で実行して結果を取得するコードの構造の全体像を理解するには十分です。

于 2012-10-05T11:48:27.613 に答える