2015-08-08 2 views
-1

Сначала я кратко опишу процесс/проблему в словах. Впоследствии я приложу весь код.onPostExecute вызывается слишком поздно

  1. Я запускаю приложение для Android в режиме отладки.
  2. Основная деятельность называется.
  3. Он вызывает Activity2 через «намерение».
  4. Затем (in onCreate) Я запускаю операцию Async для получения информации с веб-сервера. Я делаю это с помощью этой команды «new Kontakt (info1, info2, information) .execute();»

  5. Я поставил точку останова в методе onPostExecute в «Kontakt», чтобы узнать, что произойдет. Но!! Это не останавливается на достигнутом. Итак, я подумал: «okey, метод doInBackground почему-то не вызвал»

  6. Когда я продолжаю запускать код, как неожиданность вызывается onPostExecute (где-то в конце onClick) и останавливается в точке останова только так, как я хочу, но не слишком поздно, потому что я хотел бы иметь выход уже в методе onCreate, где я назвал «новый Kontakt (info1, info2, information) .execute();».

  7. Так почему же он вызывает onPostExecute слишком поздно и что я могу сделать, чтобы процесс вызывал его правильно уже в onCreate на строке «new Kontakt (info1, info2, information) .execute();» в Activity2?

Код ниже

MainActivity.java

package com.example.myapplication; 

    import android.content.Context; 
    import android.content.Intent; 
    import android.content.SharedPreferences; 
    import android.graphics.Color; 
    import android.graphics.PorterDuff; 
    import android.graphics.drawable.Drawable; 
    import android.preference.PreferenceManager; 
    import android.support.v7.app.ActionBarActivity; 
    import android.os.Bundle; 
    import android.util.Log; 
    import android.view.Menu; 
    import android.view.MenuItem; 
    import android.view.View; 
    import android.widget.Button; 
    import android.widget.TextView; 


    public class MainActivity extends ActionBarActivity implements View.OnClickListener { 
     Button button1; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

      button1 = (Button) findViewById(R.id.button1); 
      button1.setOnClickListener(this); 
     } 


     @Override 
     public void onClick(View view) { 
      switch (view.getId()) { 
       case R.id.button1: 
        Intent intent = new Intent(this, Activity2.class); 
        startActivity(intent); 
        break; 
      } 
     } 
    } 

Activity2.java

 package com.example.myapplication; 

     import android.app.AlertDialog; 
     import android.content.Context; 
     import android.content.DialogInterface; 
     import android.content.SharedPreferences; 
     import android.net.ConnectivityManager; 
     import android.net.NetworkInfo; 
     import android.preference.PreferenceManager; 
     import android.support.v7.app.ActionBarActivity; 
     import android.os.Bundle; 
     import android.text.InputType; 
     import android.text.TextUtils; 
     import android.util.Log; 
     import android.view.Menu; 
     import android.view.MenuItem; 
     import android.view.View; 
     import android.view.WindowManager; 
     import android.view.inputmethod.InputMethodManager; 
     import android.widget.Button; 
     import android.widget.EditText; 

     import org.apache.http.NameValuePair; 
     import org.apache.http.client.HttpClient; 
     import org.apache.http.client.entity.UrlEncodedFormEntity; 
     import org.apache.http.client.methods.HttpPost; 
     import org.apache.http.impl.client.DefaultHttpClient; 
     import org.apache.http.message.BasicNameValuePair; 
     import org.apache.http.params.BasicHttpParams; 
     import org.apache.http.params.HttpConnectionParams; 
     import org.apache.http.params.HttpParams; 

     import java.io.IOException; 
     import java.net.MalformedURLException; 
     import java.util.ArrayList; 


public class Activty2 extends ActionBarActivity implements View.OnClickListener { 

    Button button; 
    Context information; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity2); 
     information=this; 
     String info1="Yeah"; 
     String info2="Yeah"; 
     new Kontakt(info1, info2, information).execute(); 

     button = (Button) findViewById(R.id.button); 
     button.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View view) { 
     if (view.getId() == R.id.button) { 
     } 
    } 

Kontakt.java

package com.example.myapplication; 

import android.content.Context; 
import android.content.DialogInterface; 
import android.content.SharedPreferences; 
import android.os.AsyncTask; 
import android.util.Log; 



import org.apache.http.NameValuePair; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.message.BasicNameValuePair; 
import org.apache.http.params.BasicHttpParams; 
import org.apache.http.params.HttpConnectionParams; 
import org.apache.http.params.HttpParams; 
import org.json.JSONObject; 

import java.util.ArrayList; 

public class Kontakt extends AsyncTask<Void, Void, Integer> { 

    public static final int CONNECTION_TIMEOUT = 1000 * 15; 
    public static final String SERVER_ADDRESS = "http://test.site.net/"; 

    String info1; 
    String info2; 
    private final Context information; 

public Kontakt(String info1, String info2, Context context) { 
this.info1=info1; 
this.Info2=info2; 
    this.information=context; 
} 


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


      ArrayList<NameValuePair> dataToSend = new ArrayList<>(); 
      dataToSend.add(new BasicNameValuePair("user", info1)); 
      dataToSend.add(new BasicNameValuePair("password", info2)); 

      HttpParams httpRequestParams = getHttpRequestParams(); 

      HttpClient client = new DefaultHttpClient(httpRequestParams); 
      HttpPost post = new HttpPost(SERVER_ADDRESS 
        + "Register.php"); 

      try { 
       post.setEntity(new UrlEncodedFormEntity(dataToSend)); 
       client.execute(post); 
       int result=1; 
       return result; 

      } catch (Exception e) { 
       e.printStackTrace(); 
       int result=0; 
       return result; 
      } 
//return null; 

     } 

    private HttpParams getHttpRequestParams() { 
     HttpParams httpRequestParams = new BasicHttpParams(); 
     HttpConnectionParams.setConnectionTimeout(httpRequestParams, 
       CONNECTION_TIMEOUT); 
     HttpConnectionParams.setSoTimeout(httpRequestParams, 
       CONNECTION_TIMEOUT); 
     return httpRequestParams; 
    } 

    @Override 
    protected void onPostExecute(Integer result) 
    { 
     super.onPostExecute(result); 
     SharedPreferences.Editor editor = information.getSharedPreferences("INTERNET_KOLL", Context.MODE_PRIVATE).edit(); 
     editor.putString("internet_status", String.valueOf(result)); 
     editor.commit(); 
    } 

} 
+0

Не снова ... AsyncTask с помощью потоков ... Вы не получите результаты onCreate ... Почему? потому что это ** async ** task http://ideone.com/PPHi95 – Selvin

+0

@Selvin Я не понимаю ваш комментарий: в этом коде нет нити. ?? – Xebax

+0

Серьезно вы не видите сходства? может быть, когда-нибудь ... Во всяком случае, с AsyncTask вы даже можете быть уверены, что он не будет запускаться onPostExecute до тех пор, пока onCreate не закончит, поскольку использует обработчик для отправки выполнения в основной поток. – Selvin

ответ

0

В Activity2, когда onCreate() звонки new Kontakt(info1, info2, information).execute();:

  • асинхронная задача (Kontakt) запускается в фоновом режиме
  • исполнение onCreate() продолжает

так что это нормально, что вы не немедленно ответьте.

Смежные вопросы