2015-11-22 20 views
1

我遇到了問題,並且我沒有想法如何解決它。試圖處理服務中的不同場景

目標是,當用戶點擊按鈕時,根據設置中選擇的內容加載URL。

問題是,我無法正確設置它。

邏輯上(對我來說),我試圖在服務中設置它。點擊按鈕>服務開始> URL從「IF ELSE」加載。 問題是,我得到一個錯誤「IF ELSE」 - 「方法時長必須從UI線程調用,目前推斷線程是工人

public static class Service extends IntentService { 
    public Service() { 
     super("wallpaperchanger-download"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     MainActivity mainActivity; 
     mainActivity = new MainActivity(); 

     if (mainActivity.mEditTextHashtag.length() > 2) { 

      WallpaperManager wm = WallpaperManager.getInstance(this); 
      int height = wm.getDesiredMinimumHeight(); 
      int width = wm.getDesiredMinimumWidth(); 

      String url = "https://source.unsplash.com/all/?" + mainActivity.mEditTextHashtag.getText() + "/" + width + "x" + height + "/"; 
      try { 
       InputStream input = new URL(url).openStream(); 
       Log.v(TAG, url); 
       wm.setStream(input); 
       input.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      loading = false; 
     } 

    } 
} 

好,不夠公平 我創造了新的方法getPhoto。 ();在UI線程中,並把代碼放在那裏,然後,我調用mainActivity.getPhoto();在服務 問題是,我得到一個錯誤 - 「試圖調用虛擬方法'int android.widget.EditText.length ()」對空對象引用」

上我應該做的

的完整代碼的任何想法? LL它的輝煌:

package com.edip.splashwallpaper; 

import android.app.AlarmManager; 
import android.app.IntentService; 
import android.app.PendingIntent; 
import android.app.WallpaperManager; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Spinner; 
import android.widget.Switch; 
import android.widget.Toast; 

import java.io.InputStream; 
import java.net.URL; 

public class MainActivity extends android.app.Activity { 

    final static String TAG = "AllInOne"; 
    final static int CHANGE_INTERVAL = 30 * 1000; //30 sec for testing 
    static boolean loading = false; 
    WallpaperManager wm; 

    //Layout Views 
    Switch mSwitchFixedPhoto, mSwitchControls, mSwitchSave, mSwitchPause; 
    Spinner mSpinnerCategories, mSpinnerInterval; 
    EditText mEditTextHashtag; 
    Button mWallpaperButton; 


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

     //Layout Views Initialized 
     mSwitchFixedPhoto = (Switch) findViewById(R.id.sw_fixedphoto); 
     mSwitchControls = (Switch) findViewById(R.id.switch_controls); 
     mSwitchSave = (Switch) findViewById(R.id.switch_save); 
     mSwitchPause = (Switch) findViewById(R.id.switch_pause); 
     mSpinnerCategories = (Spinner) findViewById(R.id.spinner_categories); 
     mSpinnerInterval = (Spinner) findViewById(R.id.spinner_interval); 
     mEditTextHashtag = (EditText) findViewById(R.id.et_hashtag); 
     mWallpaperButton = (Button) findViewById(R.id.btn_set_wallpaper); 


     // Create an ArrayAdapter using the string array and a default spinner layout 
     ArrayAdapter<CharSequence> adapterCategory = ArrayAdapter.createFromResource(this, 
       R.array.categories_array, R.layout.dialog_spinner_layout); 
     // Specify the layout to use when the list of choices appears 
     adapterCategory.setDropDownViewResource(R.layout.dialog_spinner_layout); 
     // Apply the adapter to the spinner 
     mSpinnerCategories.setAdapter(adapterCategory); 

     ArrayAdapter<CharSequence> adapterInterval = ArrayAdapter.createFromResource(this, 
       R.array.interval_array, R.layout.dialog_spinner_layout); 
     adapterInterval.setDropDownViewResource(R.layout.dialog_spinner_layout); 
     mSpinnerInterval.setAdapter(adapterInterval); 

     mWallpaperButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       PendingIntent pending = PendingIntent.getBroadcast(MainActivity.this, 
         666, new Intent("com.edip.splashwallpaper.CHANGE_WALLPAPTER_TIMER"), 
         PendingIntent.FLAG_CANCEL_CURRENT); 

       ((AlarmManager) getSystemService(Context.ALARM_SERVICE)) 
         .setRepeating(AlarmManager.RTC, System.currentTimeMillis(), 
           CHANGE_INTERVAL, pending); 

      } 
     }); 

    } 

    public void getPhoto() { 

     if (mEditTextHashtag.length() > 2) { 

      wm = WallpaperManager.getInstance(this); 
      int height = wm.getDesiredMinimumHeight(); 
      int width = wm.getDesiredMinimumWidth(); 

      String url = "https://source.unsplash.com/all/?" + mEditTextHashtag.getText() + "/" + width + "x" + height + "/"; 
      try { 
       InputStream input = new URL(url).openStream(); 
       Log.v(TAG, url); 
       wm.setStream(input); 
       input.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      loading = false; 

     } else { 

      Toast.makeText(this, "Something else", Toast.LENGTH_SHORT).show(); 

     } 

    } 

    public static class Service extends IntentService { 
     public Service() { 
      super("wallpaperchanger-download"); 
     } 

     @Override 
     protected void onHandleIntent(Intent intent) { 
      MainActivity mainActivity; 
      mainActivity = new MainActivity(); 

      mainActivity.getPhoto(); 
     } 
    } 

    public static class AlarmReceiver extends BroadcastReceiver { 
     @Override 
     public void onReceive(final Context context, Intent intent) { 
      if (!loading) { 
       loading = true; 
       context.startService(new Intent(context, Service.class)); 
      } 
     } 
    } 
} 

謝謝:)

回答

1

首先,你應該永遠通過自己實例化的活動。

其次,作爲一種最佳實踐,您的服務不應該瞭解您的活動,或者它有一個編輯文本。相反,你應該將此網址發送給您的意圖內加載,當創建的PendingIntent,就像這樣:

Intent intent = new Intent("com.edip.splashwallpaper.CHANGE_WALLPAPTER_TIMER"); 
intent.putExtra("USER_URL", "https://source.unsplash.com/all/?" + mEditTextHashtag.getText() + "/" + width + "x" + height + "/"); 
PendingIntent pending = PendingIntent.getBroadcast(MainActivity.this, 
        666, intent, PendingIntent.FLAG_CANCEL_CURRENT); 

那麼你的服務中,讀取URL像這樣:

@Override 
protected void onHandleIntent(Intent intent) { 
    String url = intent.getStringExtra("USER_URL"); 
    // ... 
} 
+0

感謝您的信息。我會牢記這一點。 我設法根據我的喜好設置一切,但有點不同。 您的想法使用putExtra是我需要的。 – xsonz