2015-08-08 77 views
-1

首先我将用文字简要描述过程/问题。之后,我会附上所有的代码。onPostExecute被调用的太迟

  1. 我以调试模式启动android应用程序。
  2. 主要活动被调用。
  3. 它通过“intent”调用Activity2。
  4. 然后(在onCreate)我开始一个异步活动,以便从Web服务器获取信息。我用这个命令“new Kontakt(info1,info2,information).execute();”

  5. 我已经在“Kontakt”的onPostExecute方法中设置了一个断点来查看会发生什么。但!!它并不止于此。然后我想,“okey,doInBackground方法并没有因为某种原因而被调用”

  6. 当我继续运行代码时,令人惊讶的是,onPostExecute被调用(在onClick结尾的某处)并停止只是我想要它的方式,而不是已经太晚了,因为我希望在onCreate方法中已经有输出,我称之为“新Kontakt(info1,info2,information).execute();”。

  7. 那么为什么它调用onPostExecute为时已晚,我可以做些什么来使进程调用它已经在onCreate中的新行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中获得结果...为什么?因为它是**异步**任务http://ideone.com/PPHi95 – Selvin

+0

@Selvin我不明白你的评论:这个代码中没有线程。 ?? – Xebax

+0

说真的,你看不到相似之处?也许有一天......无论如何,使用AsyncTask你甚至可以确定它不会运行onPostExecute,直到onCreate完成,因为它使用处理程序来执行后主线程.. – Selvin

回答

0

Activity2,当onCreate()电话new Kontakt(info1, info2, information).execute();

  • 异步任务(Kontakt)在后台启动
  • onCreate()继续执行

所以这是正常的,你不立即得到答复。