2013-02-27 2 views
0

Прежде всего позвольте мне отметить, что это мой первый раз, когда я кодирую приложение и даже Java. Я привык к кодированию PHP и JS, так пожалуйста, будьте добрыЗвонок из класса, отличного от MainActivity

Im следуя Google ведут http://developer.android.com/training/basics/network-ops/connecting.html

Вот моя Основная деятельность

package com.example.eerstetest; 

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.View; 
import android.widget.EditText; 

public class MainActivity extends Activity { 
public final static String EXTRA_MESSAGE = "com.example.eerstetest.MESSAGE"; 

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

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

public void sendMessage(View view) { 
    Intent intent = new Intent(this, DisplayMessageActivity.class); 
    EditText editText = (EditText) findViewById(R.id.edit_message); 
    String message = editText.getText().toString(); 
    intent.putExtra(EXTRA_MESSAGE, message); 
    startActivity(intent); 
} 

public void getUpdate(View view) { 
    Intent intent = new Intent(this, DisplayMessageActivity.class); 

    // see if there is a data connection 
    ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); 
    if (networkInfo != null && networkInfo.isConnected()) { 
     // fetch data 
     //textView.setText("Network connection available."); 
     String dataUrl = "http://www.myurl.com"; 
     new DownloadUpdate().execute(dataUrl); 
    } else { 
     // display error 
     //textView.setText("No network connection available."); 
     String message = "No network connection available."; 
     intent.putExtra(EXTRA_MESSAGE, message); 
     startActivity(intent); 
    } 
} 
} 

Как вы можете видеть, у меня есть метод SendMessage, который работает, используя DisplayMessageActivity у меня также есть метод getUpdate, которым называет класс DownloadUpdate, который находится в отдельном файле .java

package com.example.eerstetest; 

import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.Reader; 
import java.io.UnsupportedEncodingException; 
import java.net.HttpURLConnection; 
import java.net.URL; 

import android.content.Context; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.util.Log; 

// Uses AsyncTask to create a task away from the main UI thread. This task takes a 
// URL string and uses it to create an HttpUrlConnection. Once the connection 
// has been established, the AsyncTask downloads the contents of the webpage as 
// an InputStream. Finally, the InputStream is converted into a string, which is 
// displayed in the UI by the AsyncTask's onPostExecute method. 
public class DownloadUpdate extends AsyncTask<String, Integer, String> { 
private static final String DEBUG_TAG = "HttpExample"; 
//private TextView textView; 
public final static String EXTRA_MESSAGE = "com.example.eerstetest.MESSAGE"; 

@Override 
protected String doInBackground(String... url) { 

    // params comes from the execute() call: params[0] is the url. 
    try { 
     return downloadUrl(url[0]); 
    } catch (IOException e) { 
     return "Unable to retrieve web page. URL may be invalid."; 
    } 
} 

// onPostExecute displays the results of the AsyncTask. 
@Override 
protected void onPostExecute(String result) { 
    //textView.setText(result); 
    Intent intent = new Intent(this, DisplayMessageActivity.class); 
    intent.putExtra(EXTRA_MESSAGE, result); 
    startActivity(intent); 
} 

// Given a URL, establishes an HttpUrlConnection and retrieves 
// the web page content as a InputStream, which it returns as 
// a string. 
private String downloadUrl(String myurl) throws IOException { 
    InputStream is = null; 
    // Only display the first 500 characters of the retrieved 
    // web page content. 
    int len = 500; 

    try { 
     URL url = new URL(myurl); 
     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.setReadTimeout(10000 /* milliseconds */); 
     conn.setConnectTimeout(15000 /* milliseconds */); 
     conn.setRequestMethod("GET"); 
     conn.setDoInput(true); 
     // Starts the query 
     conn.connect(); 
     int response = conn.getResponseCode(); 
     Log.d(DEBUG_TAG, "The response is: " + response); 
     is = conn.getInputStream(); 

     // Convert the InputStream into a string 
     String contentAsString = readIt(is, len); 
     return contentAsString; 

    // Makes sure that the InputStream is closed after the app is 
    // finished using it. 
    } finally { 
     if (is != null) { 
      is.close(); 
     } 
    } 
} 

// Reads an InputStream and converts it to a String. 
public String readIt(InputStream stream, int len) throws IOException, UnsupportedEncodingException { 
    Reader reader = null; 
    reader = new InputStreamReader(stream, "UTF-8");   
    char[] buffer = new char[len]; 
    reader.read(buffer); 
    return new String(buffer); 
} 
} 

Я не понимаю, что я должен заполнить для контекста при вызове DisplayMessageActivity отсюда

быть полными, здесь м файл манифеста

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.eerstetest" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="17" /> 

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="com.example.eerstetest.MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name="com.example.eerstetest.DisplayMessageActivity" 
     android:label="@string/title_activity_display_message" 
     android:parentActivityName="com.example.eerstetest.MainActivity" > 
     <meta-data 
      android:name="android.support.PARENT_ACTIVITY" 
      android:value="com.example.eerstetest.MainActivity" /> 
    </activity> 
    <activity 
     android:name="com.example.eerstetest.DownloadUpdate" 
     android:label="@string/title_activity_download_update" > 
    </activity> 
</application> 

</manifest> 

Если есть что-то дополнительное, я могу предоставить , пожалуйста, дайте мне знать

ответ

1

передать контекст в качестве параметра, как это:

new DownloadUpdate(MainActivity.this).execute(dataUrl); 

добавить конструктор в DownloadUpdate:

Context context; 
public DownloadUpdate(Context context){ 
    this.context = context 
} 

, а затем использовать контекст в классе DownloadUpdate в качестве глобального параметра и вызвать намерение с помощью этого

Intent intent = new Intent(DownloadUpdate.this, DisplayMessageActivity.class); 
intent.putExtra(EXTRA_MESSAGE, result); 
context.startActivity(intent); 
+0

Это трюк, спасибо большое! – Surya

0

вызов вроде этого:

Intent intent = new Intent(DownloadUpdate.this, DisplayMessageActivity.class); 
intent.putExtra(EXTRA_MESSAGE, result); 
startActivity(intent); 
+0

Я пробовал это, и это не сработало, но ответ (аналогичный) Ананда действительно сработал. Благодарю. – Surya

0

я думаю, ур вызова DownloadUpdate из другой класс или деятельность в качестве:

new DownloadUpdate().execute(params); 

решить проблему контекста в DownloadUpdate, создать конструктор, как:

public DownloadUpdate(Context context){ 
    this.context = context; 
} 

здесь this.context означает, что ваш глобально объявленной Context переменной в DownloadUpdate классе. затем вызвать DownloadUpdate как:

new DownloadUpdate(your_context).execute(params); 

затем использовать контекст вы должны получить в DownloadUpdate создать свое намерение. например:

@Override 
protected void onPostExecute(String result) { 
    //textView.setText(result); 
    Intent intent = new Intent(context, DisplayMessageActivity.class); 
    intent.putExtra(EXTRA_MESSAGE, result); 
    startActivity(intent); 
} 
Смежные вопросы