2016-04-11 5 views
-1

Ich entwickle Android-App, in der ich einige Daten an den Server senden muss und eine Antwort vom Server dafür bekomme, verwende ich AsynkTask. Gerade jetzt bekomme ich Antwort in onPostExecute-Methode von Asynktask und update UI nach Server-Antwort in OnPostexecute-Methode von AsynkTask. Was ich will, ist die UI nicht von onPostexecute-Methode, sondern von einem anderen Thread mit Handler zu aktualisieren, um die Belastung von Haupt-Thread zu reduzieren. Wie kann ich das tun, sagen Sie mir bitte.Wie UI von einem anderen Thread mit Handler in Android aktualisieren?

hier ist mein Code von 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

Warum brauchen Sie hier einen Handler? Ich sehe keinen Vorteil. –

+0

Um die Last vom Haupt-Thread zu reduzieren – niraj

+0

reduzieren Sie die Belastung durch den Haupt-Thread – niraj

Antwort

1

Sie brauchen keinen Handler brauchen. Führen Sie das schwere Heben in AsyncTaskdoInBackground durch und aktualisieren Sie dann nur die Benutzeroberfläche in onPostExecute. Die Methode onPostExecute wird im selben Thread wie der Aufruf execute() aufgerufen. Wenn Sie also im UI-Thread starten, wird der UI-Thread beendet.

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

Veröffentlichung einer Nachricht an einen Handler oder runOnUiThread verwendet, wird nicht wirklich Sie mehr kaufen. Es wäre im Wesentlichen dasselbe, nur etwas später ausgeführt.

0

Jede Art und Weise, wenn Sie Aufgabe in UI-Thread aktualisieren möchten könnte Gebrauch runOnUiThread

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

hey Ich möchte Ui von externen Thread nicht in ONPOSTEXECUTE aktualisieren – niraj

+0

Sie können es überall verwenden, auch wie doInBackground! –

+0

aber in meinem Fall, während ich in doInbackroung benutze geben Sie mir Fehler – niraj

0
  • Sie können nicht die Benutzeroberfläche von einem anderen Thread aktualisieren oder von doInBackground() von AsyncTask.
  • Um Ihre Anforderung am besten passen Sie tun können, ist-

    ganze Sache http Anfrage Do und Serveranfrage und Antwort Dinge in einem anderen Thread.

    Dann, wenn Sie etwas in UI aktualisieren müssen, starten Sie einfach eine asynctask für diese.

    Dies wird Ihre Verarbeitung schneller machen, wie Sie Multithreading sind.

Ich hoffe, diese Antwort hat Ihnen geholfen.

+0

geben Sie mir die Referenz für diese – niraj

+0

welche Referenz? Es gibt programmspezifische Logikarten. Du kannst nur den Weg sagen. und Sie müssen dies in Ihrem Code anwenden. Bitte sag was du brauchst, sei spezifisch. –

+0

wie man thread von post-daten machen, getresponse und update Ui – niraj

0

Eine andere Option könnte für Sie nützlich sein, EventBus, in dem Sie Ihre UI aktualisieren und Nachrichten an und von senden können: Aktivitäten, Threads, Fragmente, ETC. Ich empfehle zu versuchen, GreenRobot's EventBus zu verwenden.

Verwandte Themen