2016-07-06 16 views
-3

**編集:解決**AsyncTaskにコードを移動

私はAsyncTask機能でサンプルコードをテストしています。しかし、dobackGround()メソッドはコードを呼び出さない。私はポストのいくつかのヘルプを取り、私のコードをリファクタリング、しかし、まだこれは

<EditText 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/editText1"> 
    </EditText> 

    <Button 
     android:text="Get Name" 
     android:id="@+id/button1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
    </Button> 

    <TextView 
     android:text="from Web service" 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
    </TextView> 

MainActivity.java

public class MainActivity extends Activity 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

    } 
} 

WebServiceActivity.java

主なレイアウトである

が動作していません

public class WebServiceActivity extends Activity implements View.OnClickListener { 

    Button btn; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     btn = (Button) findViewById(R.id.button1); 
     btn.setOnClickListener(this); 
    } 

    public void onClick(View view) { 

     switch (view.getId()) { 
      case R.id.button1: 
       new LongOperation().execute(""); 
       break; 
     } 
    } 

    private class LongOperation extends AsyncTask<String, Void, String> { 

     @Override 
     protected String doInBackground(String... params) { 
      for (int i = 0; i < 5; i++) { 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        Thread.interrupted(); 
       } 
      } 
      return "Executed"; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      TextView txt = (TextView) findViewById(R.id.textView1); 
      txt.setText("Executed"); // txt.setText(result); 

     } 

     @Override 
     protected void onPreExecute() {} 

     @Override 
     protected void onProgressUpdate(Void... values) {} 
    } 
} 

WebServiceActivity contains AsyncTaskを継承するInnerクラスLongOperation。私のレイアウトは正しくバインドされていませんか?

いくつかの提案私は非同期タスクのビュー全体を移動する必要がある場合

+0

必要とされている下記のリンクは便利です。 http://stackoverflow.com/questions/9671546/asynctask-android-example – Drv

答えて

1

が必要ですか?私は 関連するポストを見つけることができません

=>いいえ、すべてをAsyncTaskに移動しないでください。まず、AsyncTaskの4つの異なるメソッドの目的を理解し、それに応じて物事を移動します。

  • onPreExecute() - 実行を開始する前に準備したいもの。例えば、表示プログレスバーやダイアログ
  • doInBackground() - 長いウェブAPI呼び出し
  • onProgressUpdate()を作るように、この方法での操作を実行している書き留め - あなたは、このメソッドからUIへの部分更新をプッシュすることができます。

    : - たとえば、プログレスバー
  • onPostExecute()における出力の1/10の種類あなたは長時間実行される操作のポスト実行を実行するUIの更新または他の操作は、Web APIの呼び出し

にいくつかの他の点、すなわち

  • 最近では、AsyncTaskはあまり使われていませんが、他のアプローチです。

  • 長時間実行するタスクを実装するのに役立つサードパーティ製のライブラリと最善のライブラリがあります。例ライブラリはRetrofit、OkHttpです

  • 現在、開発者はRxJava、RxAndroidライブラリを使用しています。

0

asynctaskの内部にコード全体を入れる必要はありません。ネットワーク操作コードをasynctaskのdoInBackground()内に配置する必要があります。

public class MainActivity extends Activity 
{ 
    /** 
    * Called when the activity is first created. 
    */ 
    private static final String SOAP_ACTION ="http://tempuri.org/HelloWorld"; 

    private static final String OPERATION_NAME = "findContact"; 

    private static final String WSDL_TARGET_NAMESPACE = "http://tempuri.org/"; 

    private static final String SOAP_ADDRESS = "http://10.0.2.2:31736/WebSite3/Service.asmx"; 
    TextView tvData1; 
    EditText edata; 
    Button button; 
    String studentNo; 


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

     tvData1 = (TextView) findViewById(R.id.textView1); 
     button = (Button) findViewById(R.id.button1); 
     edata = (EditText) findViewById(R.id.editText1); 

     button.setOnClickListener(new OnClickListener() 
     { 

      public void onClick(View v) 
      { 
       studentNo = edata.getText().toString(); 

       new BackgroundTask().execute(); 
      } 
     }); 

    } 


    class BackgroundTask extends AsyncTask<String, Void, String> 
    { 

     @Override 
     protected String doInBackground(String... params) 
     { 
      SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE, OPERATION_NAME); 
      PropertyInfo propertyInfo = new PropertyInfo(); 
      propertyInfo.type = PropertyInfo.STRING_CLASS; 
      propertyInfo.name = "eid"; 

      request.addProperty(propertyInfo, studentNo); 

      SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
      envelope.dotNet = true; 
      envelope.setOutputSoapObject(request); 

      HttpTransportSE httpTransport = new HttpTransportSE(SOAP_ADDRESS); 

      try 
      { 
       httpTransport.call(SOAP_ACTION, envelope); 
       Object response = envelope.getResponse(); 
       return response.toString(); 
      } catch (Exception exception) 
      { 
       return exception.toString() + " Or enter number is not Available!"; 
      } 
     } 

     @Override 
     protected void onPostExecute(String s) 
     { 
      tvData1.setText(s); 
     } 
    } 

} 
1

私はAsyncTaskの例が必要だと思うので、ここにあります。これはAsyncTaskを使ったloginTaskの例です。それがあなたを助けることを願っています...

import android.app.ProgressDialog; 
import android.content.Context; 
import android.content.Intent; 
import android.content.res.Resources; 
import android.net.ConnectivityManager; 
import android.os.AsyncTask; 
import android.util.Log; 
import android.widget.Toast; 
import org.json.JSONException; 
import org.json.JSONObject; 

/** 
    * Created by jatin khattar on 01-10-2015. 
*/ 
public class LoginTask extends AsyncTask<String, Integer, String> { 


Context context; 
User user; 
private ConnectivityManager conMgr; 
private Resources r; 
private ProgressDialog dialog; 
private Session session; 


private final static String API_PARAM_TYPE="type"; 
private final static String API_PARAM_EMAIL="email"; 
private final static String API_PARAM_PASSWORD="password"; 



public LoginTask(Context context, User user, ConnectivityManager conMgr){ 
    this.context = context; 
    this.user = user; 
    this.conMgr = conMgr; 
    r=context.getResources(); 
    session=new Session(context); 
} 

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
    dialog=ProgressDialog.show(context, r.getString(R.string.progress_message), "Please Wait"); 
} 

@Override 
protected String doInBackground(String... params) { 
    API api=new API(this.context, conMgr); 
    api.setAPI("user"); 
    api.setAction("login"); 
    api.setParam(API_PARAM_TYPE, "general"); 
    api.setParam(API_PARAM_EMAIL, user.email); 
    api.setParam(API_PARAM_PASSWORD, user.pass); 
    String result=api.process(); 
    Log.d("API Response", result); 
    return result; 
} 

@Override 
protected void onPostExecute(String result) { 
    super.onPostExecute(result); 
    dialog.dismiss(); 
    try { 
     JSONObject res=new JSONObject(result); 
     if(res.getBoolean("success")){ 
      session.CreateSession(res.getInt("id"), res.getString("name"), res.getString("auth_key"), res.getString("email")); 
      Toast.makeText(this.context, "Logged in Successfully", Toast.LENGTH_LONG).show(); 
      Intent intnt = new Intent(context, MainActivity.class); 
      intnt.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
      context.startActivity(intnt); 
     }else{ 
      if(res.has("message")){ 
       Toast.makeText(this.context, res.getString("message"), Toast.LENGTH_SHORT).show(); 
      }else{ 
       Toast.makeText(this.context, r.getString(R.string.error_message_unknown), Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } catch (JSONException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     Toast.makeText(this.context, r.getString(R.string.error_invalid_response_message), Toast.LENGTH_SHORT).show(); 
    } 

} 

} 
0

私はコードを理解しています。これは私のコードAsyntaskです。唯一のメインクラスと1つのインナークラスが

Activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
    <EditText 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/editText1"> 
    </EditText> 

    <Button 
     android:text="Get Name" 
     android:id="@+id/button1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
    </Button> 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
    </TextView> 

    </LinearLayout> 

MainActivity.java

public class MainActivity extends Activity 
{ 

TextView tvData1; 
EditText edata; 
Button button; 

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

    tvData1 = (TextView)findViewById(R.id.textView1); 


    button=(Button)findViewById(R.id.button1); 

    button.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      new LongOperation().execute(""); 

     } 
    }); 
} 


private class LongOperation extends AsyncTask<String, Void, String> { 

    @Override 
    protected String doInBackground(String... params) { 
     for (int i = 0; i < 5; i++) { 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       Thread.interrupted(); 
      } 
     } 
     return "executed"; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     tvData1.setText(result); 
    } 

    @Override 
    protected void onPreExecute() {} 

    @Override 
    protected void onProgressUpdate(Void... values) {} 
} 
} 
関連する問題