2016-04-11 15 views
-1

私はいくつかのデータをサーバーに送信し、サーバーからこれからAsynkTaskを使用している応答を受け取る必要があるAndroidアプリケーションを開発しています。今はAsynktaskのonPostexecuteメソッドの応答を取得しており、AsynkTaskのonPostexecuteメソッドのサーバーレスポンスに従ってUIを更新しています。私が望むのは、onPostexecuteメソッドからではなく、メインThread.Howから負荷を減らすハンドラを使用して別のスレッドからUIを更新することです親切に私に教えてください。ここアンドロイドのハンドラを使用して別のスレッドからUIを更新するには?

はAsynkTaskの私のコードです: -

private class LoginAttempt extends AsyncTask<String, Void, String> { 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     CProgressBar.getInstance().showProgressBar(getActivity(), "Please wait while Logging...");// showing progress .......... 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     getLoginDetails();// getting login details from editText........... 
     InputStream inputStream = null; 
     m_oJsonsResponse = new CJsonsResponse(); 
     isFirstLogin = true; 
     try { 
      // 1. create HttpClient 
      HttpClient httpclient = new DefaultHttpClient(); 
      // 2. make POST request to the given URL 
      HttpPost httpPost = new HttpPost(s_szLoginUrl); 
      String json = ""; 
      // 3. build jsonObject 
      JSONObject jsonObject = new JSONObject(); 
      jsonObject.put("agentCode", s_szMobileNumber); 
      jsonObject.put("pin", s_szPassword); 
      jsonObject.put("firstloginflag", m_oLoginSession.isLogin()); 
      // 4. convert JSONObject to JSON to String 
      json = jsonObject.toString(); 
      // 5. set json to StringEntity 
      StringEntity se = new StringEntity(json); 
      // 6. set httpPost Entity 
      httpPost.setEntity(se); 
      // 7. Set some headers to inform server about the type of the content 
      // httpPost.setHeader("Accept", "application/json"); ///not required 
      httpPost.setHeader("Content-type", "application/json"); 
      // 8. Execute POST request to the given URL 
      HttpResponse httpResponse = httpclient.execute(httpPost); 
      HttpEntity entity = httpResponse.getEntity(); 
      // 9. receive response as inputStream 
      inputStream = entity.getContent(); 
      System.out.print("InputStream...." + inputStream.toString()); 
      System.out.print("Response...." + httpResponse.toString()); 

      StatusLine statusLine = httpResponse.getStatusLine(); 
      System.out.print("statusLine......" + statusLine.toString()); 
      ////Log.d("resp_body", resp_body.toString()); 
      int statusCode = statusLine.getStatusCode(); 
      if (statusCode == 200) { 
       // 10. convert inputstream to string 
       if (inputStream != null) { 
        s_szresult = m_oJsonsResponse.convertInputStreamToString(inputStream); 
       } 
      } else 
       s_szresult = "Did not work!"; 

     } catch (Exception e) { 
      Log.d("InputStream", e.getLocalizedMessage()); 
     } 
     return s_szresult; 
    } 

    @Override 
    protected void onPostExecute(final String response) { 
     super.onPostExecute(response); 
     new Handler(Looper.getMainLooper()).post(new Runnable() { 
      @Override 
      public void run() { 
       CProgressBar.getInstance().hideProgressBar();// hide progressbar after getting response from server...... 
       try { 
        m_oResponseobject = new JSONObject(response);// getting response from server 

        getResponse();// getting response from server ........ 

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

     }); 
    } 

    public void getResponse() throws JSONException { 
     if (m_oResponseobject.getString("resultdescription").equalsIgnoreCase("Transaction Successful")) { 
      m_oLoginSession.setLoginData(s_szResponseMobile, s_szResponsePassword); 
      getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.container, new CDealMainListing()).commit(); 
      CToastMessage.getInstance().showToast(getActivity(), "You are successfully Logged In"); 
     } else if (m_oResponseobject.getString("resultdescription").equalsIgnoreCase("Agentcode Can Not Be Empty")) { 
      CToastMessage.getInstance().showToast(getActivity(), "Please Enter Valid Mobile Number"); 
     } else if (m_oResponseobject.getString("resultdescription").equalsIgnoreCase("Pin Can Not Be Empty")) { 
      CToastMessage.getInstance().showToast(getActivity(), "Please Enter Password"); 
     } else if (m_oResponseobject.getString("resultdescription").equalsIgnoreCase("Invalid PIN")) { 
      CToastMessage.getInstance().showToast(getActivity(), "Please enter correct Password"); 
     } else if (m_oResponseobject.getString("resultdescription").equalsIgnoreCase("Subscriber/Agent Blocked due to Wrong Attempts")) { 
      CToastMessage.getInstance().showToast(getActivity(), "You are blocked as You finished your all attempt"); 
     } else if (m_oResponseobject.getString("resultdescription").equalsIgnoreCase("Connection Not Available")) { 
      CToastMessage.getInstance().showToast(getActivity(), "Connection Lost ! Please Try Again"); 
     } else if (m_oResponseobject.getString("resultdescription").equalsIgnoreCase("Subscriber/Agent Not Found")) { 
      CToastMessage.getInstance().showToast(getActivity(), "User not found ! Kindly Regiter before Login"); 
     } else if (m_oResponseobject.getString("resultdescription").equalsIgnoreCase("OTP not verify")) { 
      CToastMessage.getInstance().showToast(getActivity(), "Otp not Verify ! Kindly Generate Otp on Sign Up"); 
     } 
    } 
+1

なぜここでハンドラを使用する必要がありますか?私は利点を見ません。 –

+0

メインスレッドからの負荷を軽減するには – niraj

+0

メインスレッドから重い負荷を減らす – niraj

答えて

1

あなたはHandlerは必要ありません。重い持ち上げをAsyncTaskdoInBackgroundにしてから、UIを更新するのはonPostExecuteにするだけです。 onPostExecuteメソッドは​​呼び出しと同じスレッドで呼び出されるため、UIスレッドで開始するとUIスレッドで終了します。

protected void onPostExecute(final String response) { 
    super.onPostExecute(response); 
    CProgressBar.getInstance().hideProgressBar(); 
    ... 
} 

Handlerにメッセージを投稿またはrunOnUiThreadを使用しては、本当に多くのあなたを購入することはありません。基本的には同じことになりますが、少し後に実行されます。あなたはUIスレッドでタスクを更新したい場合は

0

任意の方法はAsynctaskの)あなたが別のスレッドからか、doInBackground(からあなたのUIを更新することはできませんrunOnUiThread

runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      mInfo.setText(str); 
     } 
    }); 
+0

ねえ、私はU1を外部のスレッドから更新する必要はありません – niraj

+0

doInBackgroundのようなどこでも使えます! –

+0

しかし、私の場合はdoInbackroungでエラーが発生しましたが、 – niraj

0
  • を使用することができます。あなたはIS-

    は別のスレッドですべてのHTTP要求の事とサーバ要求と応答のことを行うできる最善のあなたの条件に一致するよう

  • UIで何かを更新する必要がある場合は、このためにasynctaskを開始してください。

    これにより、マルチスレッドの処理速度が向上します。

この回答が役に立ちました。

+0

私にはその参照を与えます – niraj

+0

どのような参照?プログラム固有のロジックがあります。あなたはその道だけを伝えることができます。これをコードに適用する必要があります。あなたが必要とするものを具体的に教えてください。 –

+0

スレッドのポストデータの作成、getresponseとUiの更新方法 – niraj

0

EventBusでは、UIを更新したり、メッセージを送信したりすることができます(アクティビティ、スレッド、フラグメントなど)。 GreenRobot's EventBusを使用することをおすすめします。

関連する問題