8

androidでは、URL接続用のスレッドを作成しています。スレッド内に、グローバルに宣言された文字列に応答メッセージを格納します。メソッドメソッドにアクセスすると、nullが返されます。

    public class Rate_fetch {
       String total="";
          public String  rate(String dt)
       {
    new Thread(new Runnable(){ 

         public void run(){


            try  {

             URL url = new URL(tally_ipaddr+"/prorate.jsp?plist="+sss.toString().trim());

             HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
             InputStream in = new BufferedInputStream(urlConnection.getInputStream());
             BufferedReader r = new BufferedReader(new InputStreamReader(in));
             String x = "";
             String total = "";
             x = r.readLine();
             int i=0;

             while(x.length()>1)
             {
                 total=total+x.toString().trim();
                 i++;
                 x = r.readLine();
             }
             }
            catch(Exception e){
             return e.toString();
            }   
        }    

    }).start();

    return total;



}

メソッドを呼び出すと、nullが返されます。

 Rate_fetch rf=new Rate_fetch();
      String amt= rf.rate(prodList);
4

8 に答える 8

5

本当に使いたいThreadだけなら、これを試してみてください

    public class Rate_fetch {
    String total = "";
    boolean b = true;

    public String rate(String dt) {
        StringBuilder sb = new StringBuilder();
        new Thread(new Runnable() {

            public void run() {

                try {

                    URL url = new URL(tally_ipaddr + "/prorate.jsp?plist="
                            + sss.toString().trim());

                    HttpURLConnection urlConnection = (HttpURLConnection) url
                            .openConnection();
                    InputStream in = new BufferedInputStream(urlConnection
                            .getInputStream());
                    BufferedReader r = new BufferedReader(
                            new InputStreamReader(in));
                    StringBuilder sb = new StringBuilder();
                    String s;
                    while (true) {
                        s = r.readLine();
                        if (s == null || s.length() == 0)
                            break;
                        sb.append(s);
                    }
                    b = true;
                } catch (Exception e) {
                    b = true;
                }
            }

        }).start();
        while (b) {

        }
        total = sb.toString();
        return sb.toString();

    }
}
于 2013-03-13T08:11:07.333 に答える
2

UIスレッドをブロックしないために、別のスレッドで高価な、または潜在的に長い操作を行うためにスレッドを使用するため、スレッドを使用することの全体的なポイントが欠けています。したがって、スレッドを開始してすぐに結果を取得することは期待できません。Premsurajのように、スレッドが終了する前にスレッドが返されます。

他の人が示唆しているように、これを行うためのよりクリーンな方法は、AsyncTaskを使用することです。これは、プロセスを3つの主要な段階でカプセル化します。実際に非同期作業を行い、3番目は操作全体の結果を処理するために使用されます。

これが1つの簡単な例です。もちろん、改善することはできますが、理解するのに役立つはずです。

Rate_fetch

同じクラスですが、スレッド化されていません。

public class Rate_fetch {

       public String rate(String dt)
       {
            String total="";
            try  {

                URL url = new URL(tally_ipaddr+"/prorate.jsp?plist="+sss.toString().trim());

                HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                InputStream in = new BufferedInputStream(urlConnection.getInputStream());
                BufferedReader r = new BufferedReader(new InputStreamReader(in));
                String x = "";
                String total = "";
                x = r.readLine();
                int i=0;

                while(x.length()>1)
                {
                    total=total+x.toString().trim();
                    i++;
                    x = r.readLine();
                }
            }
            catch(Exception e){
                return e.toString();
            };

            return total;
        }

    }

アクティビティの例:

public class YourActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.layout);

        GetRate asyncRate = new GetRate();
        asyncRate.execute(); // starting the task, can be done wherever you need, for example a Button click event
    }

    private class GetRate extends AsyncTask<Void, Integer, String> {

        @Override
        protected String doInBackground(Void... params) {

            Rate_fetch fetch = new Rate_fetch();
            string rate = fetch.rate();

            return rate;
        }

        @Override
        protected void onPostExecute(String rate) {                     
            // Do whatever you need with the string, you can update your UI from here
        }
    }

}

それが役に立てば幸い。

于 2013-03-13T08:03:04.823 に答える
2

メソッドがスレッドを実行しているresultため、はnullの値を取得しているため、はスレッドの終了を待機していません。ratereturn

次のいずれかの手法を使用して問題を解決できます

  • ハンドラー
  • 非同期。タスク

また、参照用のリンクを見ることができます。

http://mobileorchard.com/android-app-developmentthreading-part-1-handlers/

于 2013-03-13T08:13:13.190 に答える
1

おそらく、メイン/現在のスレッド/クラスの参照をスレッドに渡すことができます。スレッドはその結果をその参照オブジェクトに格納します。

以下は簡単な例です。

class CallerTest{
 private ResultData result; // any data that you want from thread

 public void caller() throws Exception{
   ThreadClass thread = new ThreadClass(this);
   thread.start();

   //wait for thread to finish
   thread.join();

   //now you have data in >> this.result
 }

 public void setResult(ResultData rd){
   this.result = rd; 
 }
}

class ThreadClass extends Thread{
    CallerTest cl;
    public ThreadClass(CallerTest cl){
       this.cl = cl;
    }
    public void run() {
     ResultData rd;
     rd = //do code to retrive result
     cl.setResult(rd);
    }

}
于 2013-03-13T09:07:53.260 に答える
0

別のスレッドを使用してロジックを実行することを選択した場合、スレッド内のコードの実行は非同期になるため、非同期スレッドの実行を無視して結果にすぐにアクセスすることはできません。http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/FutureTask.htmlのようなものを使用することを検討する必要があります

于 2013-03-13T07:49:50.503 に答える
0

クラス変数を宣言し、スレッドでオブジェクトを渡すだけです

于 2013-03-13T07:43:40.637 に答える
0

スレッドから値を返すことはできません。関数Rate_fetchは、スレッドが実行を開始する前に戻ります。解決策は、AsyncTaskを使用し、そのonPostExecuteで値を使用することです。

于 2013-03-13T07:44:47.680 に答える
0

スレッドローカルを見てください、それはあなたがそれ自身のローカル変数であるスレッドでパラメータを運ぶようにします。

于 2013-03-13T08:57:04.493 に答える