2015-07-21 18 views
-3

我使用asynctask從數據庫中獲取用戶信息,因爲您無法在其前端任務中執行此操作...當任務完成時,我希望返回到我打電話給這個Asynctask有沒有辦法做到這一點?如何在Asynctask中回撥我的父級活動

我的目標是啓動另一個活動時的AsyncTask完成

package com.example.eightmiles; 
import android.app.AlertDialog; 
import android.content.Context; 
import android.os.AsyncTask; 
import android.print.PrintAttributes; 
import android.widget.Toast; 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.net.URLEncoder; 
import java.util.StringTokenizer; 

public class Backgroundtask extends AsyncTask<String, Void, String> { 
    AlertDialog alertDialog; 
    AlertDialog alertDialog2; 
    Context ctx; 
    Signin signin; 
    Userlocalstore userlocalstore; 
    String res_name , res_username , res_dob , res_email , res_id , res_pass; 
    Backgroundtask(Context ctx) 
    { 
    this.ctx =ctx; 
    } 

    @Override 
    protected void onPreExecute() { 
    alertDialog = new AlertDialog.Builder(ctx).create(); 
    alertDialog.setTitle("Login Information...."); 
    alertDialog2 = new AlertDialog.Builder(ctx).create(); 

    alertDialog2.setTitle("Apologies"); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
    String reg_url = "http://8miles.freeiz.com/Register.php"; 
    String login_url = "http://8miles.freeiz.com/getuserinfo.php"; 
    String method = params[0]; 
    if (method.equals("Register")) { 
     String name = params[1]; 
     String user_name = params[2]; 
     String user_pass = params[3]; 
     String email = params[4]; 
     String dob = params[5]; 

回答

1

AsyncTaskOnPostExecute方法,通過Intent開始新的活動,並通過加載的數據一起吧。

@Override 
protected void onPostExecute(String data) { 
    Intent intent = new Intent(MainActivity.this, WhateverActivityToStart.class); 
    intent.putExtra("SOME_DATA", data); 
    MainActivity.this.startActivity(intent); 
} 

你需要熟悉starting an activitypassing data between activities

+0

它不是那麼簡單..即使我已經通過我的活動對象爲asyctask custructor並保存它....這是不可能的......這說「構造函數意圖(Backgroundtask,類)未定義」 –

+0

將與第一個參數相同的活動引用傳遞給Intent構造函數。我會更新片段。 – Boots

+0

嘗試:'Intent intent = new Intent(MyActivity.this,WhateverActivity.class);' – BladeCoder

0

這就是onPostExecute()可以。你可以check the docs並看到第四步。

基本上,您將無法返回到您稱爲AsyncTask的位置,因爲這是異步過程按設計執行的操作。

相反,因爲在AsyncTask完成時在UI線程中調用onPostExecute(),您可以使用它來啓動一個活動,顯示一個toast和其他東西。

+0

多數民衆贊成的觀點...我無法啓動一個活動使用onPostExecute().. –

+0

關於「意圖意圖=新的意圖(這,WhateverActivity.class);」它給了我一個錯誤:「他的構造函數Intent(Backgroundtask,類)未定義」 並在此行「startActivity(finallogin);」它給了我一個錯誤:「方法startActivity(意圖)未定義的類型BackgroundTask」 –

+0

你的問題沒有任何表明你知道onPostExecute。此外,你可以發佈該錯誤,然後我們可以真正解決出了什麼問題。 – Acapulco

0

我更喜歡使用回調時試圖做一些事情在的AsyncTask,然後回去在我的活動做的工作......雖然答案已經在這裏接受的代碼一個不錯位:

public class Backgroundtask extends AsyncTask<String, Void, String> { 
    private final TaskCallback taskCallback; 
    private final Context ctx; 
    ... 
    ... 

    public interface TaskCallback{ 
     public void taskComplete(String data); 
    } 

    Backgroundtask(Context ctx, TaskCallback taskCallback){ 
     this.ctx = ctx; 
     this.taskCallback = callback 
    } 

    ... 
    ... 

    //truncating the rest of your code, adding just the extra bit needed 

    @Override 
    protected void onPostExecute(String data) { 
     super.onPostExecute(data); 
     taskCallback(data); 
    } 
} 

然後在你的活動,你應該有這樣的:

public class MyActivity extends Activity implements TaskCallback{ 

    //again, truncating most of what would be here like onCreate, etc... 

    @Override 
    public void taskComplete(String data){ 
     //call more work here if needed 

     Intent intent = new Intent(MyActivity.this, WhateverActivityToStart.class); 
     intent.putExtra("SOME_DATA", data); 
     startActivity(intent); 

     finish(); //May or may not need this, don't want them coming back probably 
    } 

} 
相關問題