2012-04-03 5 views
1

에서 제대로 작동하지 않는 나는이AsyncTask를 안드로이드 4.0

class InternetConnexionErrorAsync extends AsyncTask<String, String, String> 
{ 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     mdpiImageView.setClickable(false); 
     journalsImageView.setClickable(false); 
     accountImageView.setClickable(false); 
     Toast.makeText(getBaseContext(),errorMessage , Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    protected String doInBackground(String... aurl) { 
     try { 
      Thread.sleep(3450); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    return null; 
    } 

    @Override 
    protected void onPostExecute(String unused) 
    { 
     finish(); 
    } 
} 

모든 것이 잘 작동 안드로이드 2.3.5에 작업을 비동기 있습니다.

Android 4.0에서이 기능을 사용하면 onPostExecute의 최신 액세스 기능을 사용할 수 있습니다.

도와주세요. onPostExecute가 더 최근에 도달했다는 오류 메시지가 없습니다.

+1

"마무리()"방법은 어떻게해야하는 것이 무엇인가? 나는 문서에서 아무것도 찾지 못한다. –

+0

재생 @STT LCU를 가져 주셔서 감사합니다.이 방법은 현재 활동을 종료합니다. –

+0

사실, doInBackground에 들어가는 것이 더 새롭고, onPreExecute 만 작동합니다. –

답변

1

@ Davek804의 제안 이후 나는 채택 된 솔루션은 내가 AsyncTask를 교체한다는 것입니다 이런 지연된 runable과 함께 :

private Runnable mMyRunnable = new Runnable() 
    { 
     public void run() 
     { 
      finish(); 
     } 
    }; 


Toast.makeText(getBaseContext(),errorMessage , Toast.LENGTH_LONG).show(); 
      Handler myHandler = new Handler(); 
      myHandler.postDelayed(mMyRunnable, 3450); 

그래서 효과는 동일합니다.

1

UI에서 업데이트해야하는 항목은 onPostExecute에서 수행해야합니다.

아래 코드는 onPostExecute를 살펴 봅니다. 특히 activity.xx() 메서드는 UI에서 작업을 수행하는 주요 활동에 대한 업데이트를 보냅니다.

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.util.ArrayList; 
import java.util.List; 
import library.DatabaseHandler; 
import library.JSONParser; 
import library.UserFunctions; 
import org.apache.http.HttpResponse; 
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.json.JSONException; 
import org.json.JSONObject; 
import com.actionbarsherlock.R; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.support.v4.app.FragmentActivity; 
import android.util.Log; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 

public class LoginTask extends AsyncTask<String, Void, Integer> { 

    private ProgressDialog progressDialog; 
    private Polling activity; 
    private int id = -1; 
    private JSONParser jsonParser; 
    private static String loginURL = "http://davidjkelley.net/android_api/"; 
    private static String registerURL = "http://davidjkelley.net/android_api/"; 
    private static String KEY_SUCCESS = "success"; 
    private static String KEY_ERROR = "error"; 
    private static String KEY_ERROR_MSG = "error_msg"; 
    private static String KEY_UID = "uid"; 
    private static String KEY_NAME = "name"; 
    private static String KEY_EMAIL = "email"; 
    private static String KEY_CREATED_AT = "created_at"; 
    private int responseCode = 0; 

    public LoginTask(Polling activity, ProgressDialog progressDialog) 
    { 
     this.activity = activity; 
     this.progressDialog = progressDialog; 
    } 

    @Override 
    protected void onPreExecute() 
    { 
     progressDialog.show(); 
    } 

    protected Integer doInBackground(String... arg0) { 
     EditText userName = (EditText)activity.findViewById(R.id.emailEditText); 
     EditText passwordEdit = (EditText)activity.findViewById(R.id.passEditText); 
     String email = userName.getText().toString(); 
     String password = passwordEdit.getText().toString(); 
     UserFunctions userFunction = new UserFunctions(); 
     JSONObject json = userFunction.loginUser(email, password); 

     // check for login response 
     try { 
      if (json.getString(KEY_SUCCESS) != null) { 
       String res = json.getString(KEY_SUCCESS); 

       if(Integer.parseInt(res) == 1){ 
        //user successfully logged in 
        // Store user details in SQLite Database 
        DatabaseHandler db = new DatabaseHandler(activity.getApplicationContext()); 
        JSONObject json_user = json.getJSONObject("user"); 
        //Log.v("name", json_user.getString(KEY_NAME)); 
        // Clear all previous data in database 
        userFunction.logoutUser(activity.getApplicationContext()); 
        db.addUser(json_user.getString(KEY_NAME), json_user.getString(KEY_EMAIL), 
          json.getString(KEY_UID), json_user.getString(KEY_CREATED_AT));       

        responseCode = 1; 
        // Close Login Screen 
        //finish(); 

       }else{ 
        responseCode = 0; 
        // Error in login 
       } 
      } 

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

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

     return responseCode; 
    } 

    @Override 
    protected void onPostExecute(Integer responseCode) 
    { 
     EditText userName = (EditText)activity.findViewById(R.id.emailEditText); 
     EditText passwordEdit = (EditText)activity.findViewById(R.id.passEditText); 

     if (responseCode == 1) { 
      progressDialog.dismiss(); 
      activity.loginReport(responseCode); 
      userName.setText(""); 
      passwordEdit.setText(""); 
      //shared prefences, store name 

     } 
     if (responseCode == 0) { 
      progressDialog.dismiss(); 
      activity.loginReport(responseCode); 

     } 
     //if(responseCode == 202) 
      //activity.login(id); 
     //else 
      //activity.showLoginError(""); 

    } 
} 

다음은 주요 활동은, 당신이 loginReport가 무엇을 볼 수 있습니다 : 예를 들어

public class Polling extends SherlockFragmentActivity { 
    private ViewPager mViewPager; 
    private TabsAdapter mTabsAdapter; 
    private final static String TAG = "21st Polling:"; 
    private Button loginButton; 
    private Button registerButton; 
    private CheckBox remember; 
    SharedPreferences sharedPreferences; 
    Toast toast; 
    ActionBar bar; 
    //DatabaseHandler ; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.v(TAG, "onCreate"); 
     mViewPager = new ViewPager(this); 
     mViewPager.setId(R.id.pager); 
     setContentView(mViewPager); 
     bar = getSupportActionBar(); 
     bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
     bar.setDisplayShowTitleEnabled(false); 
     bar.setDisplayShowHomeEnabled(false); 
     mTabsAdapter = new TabsAdapter(this, mViewPager); 
     mTabsAdapter.addTab(bar.newTab().setText(R.string.login), 
       LoginFragment.class, null); 
     mTabsAdapter.addTab(bar.newTab().setText(R.string.economics), 
       EconFragment.class, null); 
     mTabsAdapter.addTab(bar.newTab().setText(R.string.elections), 
       ElectionsFragment.class, null); 
     mTabsAdapter.addTab(bar.newTab().setText(R.string.politics), 
       PoliticsFragment.class, null); 
     mTabsAdapter.addTab(bar.newTab().setText(R.string.science), 
       ScienceFragment.class, null); 
     mTabsAdapter.addTab(bar.newTab().setText(R.string.finance), 
       FinanceFragment.class, null); 
     mTabsAdapter.addTab(bar.newTab().setText(R.string.religion), 
       ReligionFragment.class, null); 
     mTabsAdapter.addTab(bar.newTab().setText(R.string.military), 
       MilitaryFragment.class, null); 
     mTabsAdapter.addTab(bar.newTab().setText(R.string.international), 
       InternationalFragment.class, null); 
    } 

    public void loginReport(int responseCode) { 
     DatabaseHandler db = new DatabaseHandler(getApplicationContext()); 
     UserFunctions userFunctions = new UserFunctions(); 
     Context context = getApplicationContext(); 
     //login succeeded, sent when LoginTask doInBg sends a 1 to onPostExecute 
     if (responseCode == 1) { 
      loginButton = (Button)findViewById(R.id.loginButton); 
      loginButton.setText("Log Out"); 
      int duration = Toast.LENGTH_LONG; 
      Toast toast = Toast.makeText(context, "Logged in.", duration); 
      toast.show(); 
      bar.getTabAt(0).setText(db.getUserDetails().get(db.KEY_EMAIL)); 
      //Log.v(TAG, db.getUserDetails().toString()); 
     } 
     //login failed, sent when LoginTask doInBg sends a 0 to onPostExecute 
     if (responseCode == 0) { 
      int duration = Toast.LENGTH_LONG; 
      Toast toast = Toast.makeText(context, "Incorrect username/password", duration); 
      toast.show(); 
     } 
     if (responseCode == 2) { 
      //logout button clicked, listened from within LoginFragment 
      //remove user from active sql db here rather than LoginFragment?! 
      bar.getTabAt(0).setText(R.string.login); 
      int duration = Toast.LENGTH_SHORT; 
      Toast toast = Toast.makeText(context, "Logged out", duration); 
      toast.show(); 
      userFunctions.logoutUser(context); 
     } 
    } 
+0

@ Davek804에 감사드립니다. 그러나이 질문에 대한 대답이 아니며, AsyncTasks를 사용하는 방법을 알고 있습니다. 2.3.3 및 2.3.5에서 작동하지만, 이 내 4.0에 사용하여, 나는 onPreExecute에만 갈거야 .... –

+0

난 알 겠어. 음, 위에 게시 한 DoInBG 및 onPostExecute 메서드는 UI에서 많이 알지 못하는 것 같습니다. 코드 일부를 잘라 냈습니까? 그렇지 않으면 finish()는 무엇을합니까? doINBg의 타이머/절전/대기 메서드가있는 것 같습니다. 그래서 내 질문은 ... 완료 될 때 수행해야 할 ASync는 무엇입니까? – Davek804

+0

다시 한 번 감사드립니다. 또한, 내 비동기 작업의 목표는 주요 활동이 시작될 때 서버에서 데이터를 가져 오려고 시도 할 때 예외가 발생하면 비동기 작업을 호출하여 축배를 표시합니다. 메시지를 onPreExecute, 3450ms (토스트가 사라질 시간) 기다린 다음 finish() 함수를 사용하여 onPostExecute의 활동을 닫습니다. 내가 이해하지 못하는 것은 2.3.3에서는 작동하지만 4.0에서는 작동하지 않는다. –

0

나는 해결책 here

대신에 사용 발견 :

task.execute(); 

사용 :

task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);